原文链接://www.greatytc.com/p/f565a687ba75
1.麻烦:相信很多同学都用的Retrofit作为网络请求框架了,确实方便。但我觉得对于回调结果的处理就很麻烦了,如下:
private void IndexTextAdOld() {
dataProvider.shop.indexTextAd().subscribe(new Observer<BaseResponse<IndexTextAd>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BaseResponse<IndexTextAd> indexTextAdBaseResponse) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
这面的Observer
回调包含了四个方法,但我只想关心成功后的结果,就是onNext
中的内容,有的说可以用Consumer
但这样编译器会爆灰色,而且并没有处理异常情况:
2.封装:为了只关心成功数据,所以我们还是得封装一下:
public abstract class OnSuccessAndFailListener<T> extends DisposableObserver<T> {
Dialog loadDialog;
SwipeRefreshLayout refresh;
private void showLoading(){
if (loadDialog!=null) loadDialog.show();
if (refresh!=null) refresh.setRefreshing(true);
}
private void dismissLoading(){
if (loadDialog!=null) loadDialog.dismiss();
if (refresh!=null) refresh.setRefreshing(false);
}
public OnSuccessAndFailListener() {}
public OnSuccessAndFailListener(Dialog loadDialog) {
this.loadDialog=loadDialog;
}
public OnSuccessAndFailListener(SwipeRefreshLayout refresh) {
this.refresh=refresh;
}
@Override
protected void onStart() {
super.onStart();
showLoading();
}
@Override
public void onNext(T t) {
dismissLoading();
try {
BaseResponse baseResponse = (BaseResponse) t;
if (baseResponse.getStatus()==1){
onSuccess(t);
}else {
onErr(baseResponse.getMsg());
}
} catch (Exception e) {
onError(e);
onErr(e.getMessage());
}
}
@Override
public void onError(Throwable e) {
dismissLoading();
e.printStackTrace();
String message;
if (e instanceof SocketTimeoutException){
message="SocketTimeoutException:网络连接超时!";
}else if (e instanceof ConnectException){
message="ConnectException:网络无法连接!";
} else if (e instanceof HttpException) {
message="HttpException:网络中断,请检查您的网络状态!";
} else if (e instanceof UnknownHostException) {
message="UnknownHostException:网络错误,请检查您的网络状态!";
}else {
message = e.getMessage();
}
onErr(message);
}
@Override
public void onComplete() {}
protected abstract void onSuccess(T t);
//很多异常不需要反馈给用户,所以不必抽象,如果需要异常信息,重写即可
protected void onErr(String msg){
L.e("网络数据异常:"+msg);
}
}
其中BaseResponse为我们自己定义的网络数据回调类基类,这里
我们是状态码为1的时候,说明数据是正确的。有的可能是200,看后端各自定义来更改。
3.使用
dataProvider.shop.indexTextAd()
.subscribe(new OnSuccessAndFailListener<BaseResponse<IndexTextAd>>() {
@Override
protected void onSuccess(BaseResponse<IndexTextAd> indexTextAdBaseResponse) {
}
});
特点如下:
- 1.只关注正确数据的回调处理
- 2.异常情况统一处理,如需单独处理,重写
onErr()
方法即可 - 3.加载进度一参传入,无需关心加载开始结束
注意:新项目可能会遇到OnSuccessAndFailListener里面的泛型不自动补充的问题,那么你多半是没有引入java8的支持。
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
最后写代码如下写就可以了: