网络请求工具类之OkHttp3封装(二)下(支持请求取消、异步请求的线程切换)

紧接着上篇说的任务2:异步请求采用UI线程回调方式。

首先采用Handler进行线程间的通信,顺便优化下回调方法,加入HttpInfo以做到工具类使用的渗透性。

在OkHttpUtil中声明一个自定义的异步回调接口,该接口对网络请求接口进行了封装,使同步、异步请求处理流程保持一致性,代码如下:

/**
     * 异步请求回调接口
     */
    public interface CallbackOk {
        /**
         * 该回调方法已切换到UI线程
         */
        void onResponse(HttpInfo info) throws IOException;
    }

在OkHttpUtil中增加Handler业务调度代码:

private final static int WHAT_CALLBACK = 1;
/**
     * 主线程业务调度
     */
    private static Handler handler = new Handler(Looper.getMainLooper()){
        @Override
        public void handleMessage(Message msg) {
            final int what = msg.what;
            switch (what){
                case WHAT_CALLBACK:
                    try {
                        CallbackMessage callMsg = (CallbackMessage) msg.obj;
                        callMsg.callback.onResponse(callMsg.info);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                    break;
            }
        }
    };

修改OkHttpUtil中异步请求方法:

 /**
     * 异步请求
     * @param info
     * @param method
     * @param callback
     */
    private void doRequestAsync(HttpInfo info, Method method, CallbackOk callback){
        if(null == callback)
            throw new NullPointerException("CallbackOk is null that not allowed");
        Call call = httpClient.newCall(fetchRequest(info,method));
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                showLog(e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response res) throws IOException {
                //主线程回调
                handler.sendMessage(new CallbackMessage(WHAT_CALLBACK,callback,dealResponse(info,res)).build());
            }
        });
        putCall(info,call);
    }

这样逻辑应该很清晰了,异步请求后通知Handler进行回调,Handler负责线程的通信(即回调),这里CallbackMessage是对Messay进行了包裹,增加了CallbackOk与HttpInfo属性。

/**
     * 回调信息实体类
     */
    public class CallbackMessage{
        public int what;
        public CallbackOk callback;
        public HttpInfo info;
        public CallbackMessage(int what, CallbackOk callback, HttpInfo info) {
            this.what = what;
            this.callback = callback;
            this.info = info;
        }
        public Message build(){
            Message msg = new Message();
            msg.what = this.what;
            msg.obj = this;
            return msg;
        }
    }


这里对网络请求方法进行了自定义的封装处理:
private HttpInfo dealResponse(HttpInfo info, Response res){
        try {
            if(null != res && null != res.body()){
                if(res.isSuccessful()){
                    return retInfo(info,info.SUCCESS,res.body().string());
                }else{
                    showLog("HttpStatus: "+res.code());
                    if(res.code() == 404)//请求页面路径错误
                        return retInfo(info,info.CheckURL);
                    if(res.code() == 500)//服务器内部错误
                        return retInfo(info,info.NoResult);
                    if(res.code() == 502)//错误网关
                        return retInfo(info,info.CheckNet);
                    if(res.code() == 504)//网关超时
                        return retInfo(info,info.CheckNet);
                }
            }
            return retInfo(info,info.CheckURL);
        } catch (Exception e) {
            return retInfo(info,info.NoResult);
        }
    }

下面我们来看下Activity/Fragment的异步网络请求代码:

 private void doHttpAsync() {
        OkHttpUtil.Builder().build().doGetAsync(HttpInfo.Builder().setUrl(url).build(this), info ->  {
            if (info.isSuccessful()) {
                String ret = info.getRetDetail();
                tv_content.setText(ret);
            }
        });
    }

可以看出onResponse回调方法已经是在UI线程了,可以尽情修改界面,再也不用runOnUIThread包裹,这里采用了Lambda表达式,代码看起来是不是清爽多了。

项目已上传至GitHub:https://github.com/MrZhousf/OkHttp3

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值