zoukankan      html  css  js  c++  java
  • 对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)。

  • 相关阅读:
    linux引导系统
    Android开发面试经——2.常见Android基础笔试题
    Android开发面试经——1.常见人事面试问题
    Android面试题整理【转载】
    android设置软键盘搜索键以及监听搜索键点击时发生两次事件的问题解决
    Android软键盘弹出时把布局顶上去的解决方法
    Android入门:绑定本地服务
    Android aidl Binder框架浅析
    Android LayoutInflater深度解析 给你带来全新的认识
    Android RecyclerView 使用完全解析 体验艺术般的控件
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302503.html
Copyright © 2011-2022 走看看