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();
}
}));
示例中主要注意的两点是使用泛型
- onResponse方法内对应着返回的数据结果
- getTClassName()方法一定要返回泛型对应的className,这决定着CallbackToMainThread内部要做什么对应的操作。
网友评论