OkHttp3(三)--CallbackToMainThread回调回UI线程

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 {
        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() {
            @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回调回UI线程)