public class OKHttpUitls { private OKHttpGetListener onOKHttpGetListener; private MyHandler myHandler = new MyHandler(); public void post(String url, RequestBody requestBody){ OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(30, TimeUnit.SECONDS);//设置超时时间 builder.readTimeout(30, TimeUnit.SECONDS); OkHttpClient client = builder.build(); //创建请求对象 Request request = new Request.Builder() .url(url) .post(requestBody)//传递请求体 .build(); //创建Call请求队列,请求都是放到一个队列里面的 Call call = client.newCall(request); //开始异步请求 即为开启一个子线程 call.enqueue(new Callback() { //失败,成功的方法都是在子线程里面,不能直接更新UI,需要使用Handler public void onFailure(Call call, IOException e) { //网络断开的情况 Message message = myHandler.obtainMessage(); message.obj = "{code:200,message:'网络请求失败,请检查网络'}"; message.what = 0; myHandler.sendMessage(message); } public void onResponse(Call call, Response response) throws IOException { Message message = myHandler.obtainMessage(); String json = response.body().string(); message.obj = json; if(response.code()==200){//后台正常处理,没有发生异常的情况 message.what = 1; }else{ //后台发生了异常 message.what = 0; } myHandler.sendMessage(message); } }); } //在使用工具类的地方实现这个接口,将数据返回,来处理请求结果 public interface OKHttpGetListener{ void error(String error); void success(String json); } //将外部实现的接口注入进来 public void setOnOKHttpGetListener(OKHttpGetListener onOKHttpGetListener){ this.onOKHttpGetListener = onOKHttpGetListener; } //使用Handler,将数据在主线程返回 class MyHandler extends Handler { @Override public void handleMessage(Message msg) {//在这里进行UI界面的更新,这个方法是运行在UI主线程中的 int w = msg.what; if (w ==0){ String error = (String) msg.obj; onOKHttpGetListener.error(error); } if (w==1){ String json = (String) msg.obj; onOKHttpGetListener.success(json); } } } }
注意:1:耗时操作不要放在UI主线程中进行,需要另开一个子线程进行处理,处理结果是在子线程中。
2:更新UI界面需要在UI主线程中进行。
问题: 如果子线程中的处理结果需要更新UI界面该怎么办?
答案: 在子线程中通过Handler来将处理结果更新到UI界面,Handler的handMessage方法是运行在主线程中。(需要理解Handler)。