之前请求需要实现这几个方法,我们可以封装一个Observer,实现统一响应处理
编写适配器,由其他类继承这个适配器,就不用每次创建都实现接口的所有方法
public class ObserverAdapter<T> implements Observer<T> {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(T o) {
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
}
HttpObserver统一处理响应
/**
* 网络请求Observer
*/
public abstract class HttpObserver <T> extends ObserverAdapter<T> {
private static final String TAG = "HttpObserver";
/**
* 请求成功
*
* @param data
*/
public abstract void onSucceeded(T data);
/**
* 请求失败
*
* @param data
* @param e
* @return true:自己处理;false:框架处理
*/
public boolean onFailed(T data, Throwable e) {
return false;
}
@Override
public void onError(Throwable e) {
super.onError(e);
onEnd();
//处理错误
handlerRequest(null, e);
}
@Override
public void onNext(T t) {
super.onNext(t);
onEnd();
Log.d(TAG, "onNext: "+t);
if (isSucceeded(t)) {
//请求正常
onSucceeded(t);
} else {
//请求出错了
handlerRequest(t, null);
}
}
/**
* 请求结束,成功失败都会调用(调用前调用),使用在这里隐藏加载提示
*/
public void onEnd(){
}
/**
* 网络请求是否成功了
*
* @param t
* @return
*/
private boolean isSucceeded(T t) {
if (t instanceof Response) {
//retrofit里面的响应对象
//获取响应对象
Response response = (Response) t;
//获取响应码
int code = response.code();
//判断响应码
if (code >= 200 && code <= 299) {
//网络请求正常
return true;
}
// 业务相关,BaseResponse是业务代码
} else if (t instanceof BaseResponse) {
//判断具体的业务请求是否成功
BaseResponse response = (BaseResponse) t;
return response.isSucceeded();
}
return false;
}
/**
* 处理错误网络请求
*
* @param data
* @param error
*/
private void handlerRequest(T data, Throwable error) {
if (onFailed(data, error)) {
//回调了请求失败方法
//并且该方法返回了true
//返回true就表示外部手动处理错误
//那我们框架内部就不用做任何事情了
} else {
// 框架处理错误,比如弹出提示等等
}
}
}
之前的请求修改:
重写onFailed并返回true,框架就不会自动处理错误,虽然目前还没有做自动处理。
HttpObserver自动处理错误
1
1
1
1
1
1
1
1
1
1