首先我们知道Android3.0 之后已经不允许在主线程中访问网络了,我们在访问网络时必须要新建一个线程去执行,但是这样的话请求返回的响应在另一个线程中,我尝试过使用全局静态变量等等其他,最后还是使用Handler解决的问题。
注明:Android开发小白,可能这不是特别好的方法,但是亲测有效。
首先在主线程内写一个Handler
private boolean registerUser(User user) {
//准备JSON数据
JSONStringer jsonText= new JSONStringer();
try {
jsonText.object();
jsonText.key("account");
jsonText.value(user.getAccount());
jsonText.key("password");
jsonText.value(user.getPassword());
jsonText.endObject();
} catch (JSONException e) {
e.printStackTrace();
}
//准备Handler负责传递消息
Handler handler=new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Response s=(Response)msg.obj;
try {
Log.e("message:",s.body().string()); //打印响应结果的body体
} catch (IOException e) {
e.printStackTrace();
}
}
};
//调用post方法,将JSON数据发送
Network.postSync(jsonText.toString(),"http://127.0.0.1",handler); //自己写的工具类,用于post请求
return true;
}
POST请求方法:
这是我写的一个工具类,url是指定的一个网络地址,json是主线程封装好的json数据,handler是主线程传递过来,用于一会转发消息的。
public static void postSync(String json,String url,Handler handler){
new Thread(){
@Override
public void run() {
//准备请求体
RequestBody body=RequestBody.create(MediaType.parse("application/json"),json);
//准备请求
Request request=new Request.Builder().url(url).post(body).build();
Call call=okHttpClient.newCall(request);
try {
//通过Handler传递消息
Message message=Message.obtain();
//what用于设置消息id,用于在主线程区分这是哪个请求发来的response
message.what=123;
message.obj=call.execute();
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
这样下来,所有的http请求都可以通过Network.post或者Network.get方法获取返回结果,利用Handler实现跨线程传递消息。