我的所有文章会在我的个人博客首发和更新,欢迎关注。
虽然Android开发中多数情况下使用http与后台进行数据交互,但有时套接字是http不能替代的,与http有众多的的第三方库如okttp等不同,套接字并没有多少第三方库可供选择,通常都是根据实际业务自行封装,本文介绍如何在Android中封装套接字进行网络操作并更新UI。
众所周知,网络操作这种耗时操作是要放在子线程中进行的,所以套接字封装后,数据在子线程中被发送,然后将接收到的数据放进Message通过Handler发送回主线程,在进行UI更新。
- 下面以用户登录为例,将套接字封装为一个Thread类。
编写套接字Thread类
下面的代码首先发送登录指令,在收到服务端的握手信息后,然后发送在构造方法中获得的通过已定义的方法构造的xml数据,得到服务端的响应后,将响应结果通过Handler发送回主线程。
LoginSocketClient.java
package xyz.zhenhua.smartcom.net;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.Buffer;
import xyz.zhenhua.smartcom.utils.Utils;
import xyz.zhenhua.smartcom.xmlparse.ParseUser;
/**
* Created by zachary on 16/8/31.
*/
public class LoginSocketClient extends Thread {
private ParseUser parseUser = new ParseUser();
private Handler handler;
private String data;
private String ip = Utils.ip;
private int port = Utils.port;
public LoginSocketClient(Handler handler,String username, String password){
this.handler = handler;
this.data = parseUser.PackUser(username,password);
}
public void run(){
try{
Socket socket = new Socket(ip,port);
Log.i("LoginClient","获取连接中");
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Log.i("LoginClient","获取输入输出流成功");
bw.write("USER_LOGIN");
Log.i("LoginClient","已发送:"+data);
bw.flush();
String result = new String();
char []c = new char[100];
int l = 0;
while((l=br.read(c))!=-1){
result = new String(c,0,l);
Log.i("LoginClient","收到:"+result);
if(result.equals("Hello\0")){
bw.write(user);
bw.flush();
Log.i("LoginClient","已发送:"+user);
}else if(result.equals("Login_failed")){
Message message = new Message();
message.what = Utils.LOGIN_FAILE;
handler.sendMessage(message);
} else{
Message message = new Message();
message.what = Utils.LOGIN_SUCESS;
message.obj = result;
handler.sendMessage(message);
}
}
bw.close();
br.close();
socket.close();
}catch (Exception e){
}
}
}
主线程中调用LoginSocketClient
调用就更简单啦,一句话搞定,当然,要先实例化一个Handler来接收子线程中返回的信息来更新UI。
//调用LoginSocketClient
new LoginSocketClient(hanlder,username,password).start();
网友评论