对OkHttp的封装以及在子线程中如何更新UI界面

 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)。

原文地址:https://www.cnblogs.com/hzcya1995/p/13302503.html