美文网首页
OkHttp3(三)--CallbackToMainThread

OkHttp3(三)--CallbackToMainThread

作者: azu_test | 来源:发表于2019-01-24 16:40 被阅读0次

    CallbackToMainThread为自己根据Volley框架执行结束返回主线程的思想简单写的一个结果回调类。

    全部代码如下

    /**
     * @author wuyzh
     * @fuction 将返回结果直接回调给UI线程,整个方法都在UI线程内执行
     * CallbackToMainThread实现自Callback,Callback是OkHttp3请求回调要实现的接口
     * */
    public class CallbackToMainThread implements Callback {
        private Callback mCallback = null;
        private Call mCall = null;
        private IOException mIOException = null;
        private String mStringResponse = null;
        private Bitmap mBitmapResponse = null;
        /**
         * @param callback 这里是请求结果的回调,其回调方法将会在UI线程内执行
         * */
        public CallbackToMainThread(Callback callback){
            mCallback = callback;
        }
        /**
         * 此处new android.os.Handler(Looper.getMainLooper()).post(runnableFailureUI)是将失败通过UI线程返回
         * */
        @Override
        public void onFailure(Call call, IOException e) {
            mCall = call;
            mIOException = e;
            new android.os.Handler(Looper.getMainLooper()).post(runnableFailureUI);
        }
    
        /**
         * 这里会根据主线程内Callback的getTClassName实现来获取想要得到的数据类型,然后去做类型转化
         * */
        @Override
        public void onResponse(Call call, Response response) {
            mCall = call;
            try {
                if (mCallback.getTClassName().equals(String.class.getName())){
                    mStringResponse = response.body().string();
                }else if (mCallback.getTClassName().equals(Bitmap.class.getName())){
                    byte[] data = response.body().bytes();
                    BitmapFactory.Options decodeOptions = new BitmapFactory.Options();
    
                    decodeOptions.inPreferredConfig = Bitmap.Config.RGB_565;
                    mBitmapResponse = BitmapFactory.decodeByteArray(data, 0, data.length, decodeOptions);
                }
            } catch (IOException e) {
                mIOException = e;
                new android.os.Handler(Looper.getMainLooper()).post(runnableFailureUI);
            }
            new android.os.Handler(Looper.getMainLooper()).post(runnableSuccessUI);
        }
        Runnable runnableFailureUI = new Runnable() {
            @Override
            public void run() {
                mCallback.onFailure(mCall,mIOException);
            }
        };
    
        Runnable runnableSuccessUI = new Runnable() {
            @Override
            public void run() {
                try {
                    if (mStringResponse != null){
                        mCallback.onResponse(mCall,mStringResponse);
                    }else if (mBitmapResponse != null){
                        mCallback.onResponse(mCall,mBitmapResponse);
                    }
    
                } catch (IOException e) {
                    mCallback.onFailure(mCall,e);
                }
            }
        };
    
        /**
         * 此处接口将会在UI线程内实现
         * 成功失败都将会通过这里面的方法返回给UI线程
         * */
        public interface Callback<T> {
            void onFailure(Call call, IOException e);
            void onResponse(Call call, T response) throws IOException;
            String getTClassName();
        }
    }
    

    其实主要思想就是实现OkHttp3原有的CallBack接口,然后在接口内做相对应的操作,之后把处理结果通过Handler返回到UI线程去执行。
    要注意的点是Response一定要在原来线程或者子线程内执行,千万不能返回给UI线程在UI线程内做数据解析,因为这样做会报主线程内执行网络操作异常

    使用示例

    call.enqueue(new CallbackToMainThread(new CallbackToMainThread.Callback<Bitmap>() {
                @Override
                public void onFailure(Call call, IOException e) {
                    LogShowUtil.addLog("OkHttp",e.getMessage());
                }
    
                @Override
                public void onResponse(Call call, Bitmap response) throws IOException {
                    imageView.setImageBitmap(response);
                }
    
                @Override
                public String getTClassName() {
                    return Bitmap.class.getName();
                }
            }));
    

    示例中主要注意的两点是使用泛型

    1. onResponse方法内对应着返回的数据结果
    2. getTClassName()方法一定要返回泛型对应的className,这决定着CallbackToMainThread内部要做什么对应的操作。

    相关文章

      网友评论

          本文标题:OkHttp3(三)--CallbackToMainThread

          本文链接:https://www.haomeiwen.com/subject/gghujqtx.html