Retrofit+RxJava优雅的处理服务器返回异常、错误概要.doc
文本预览下载声明
Retrofit+RxJava 优雅的处理服务器返回异常、错误
异常错误
实际开发经常有这种情况,比如登录请求,接口返回的
信息包括请求返回的状态:失败还是成功,错误码,User对象等等。如果网络等原因引起的登录失败可以归结为异常,如果是用户信息输入错误导致的登录失败算是错误。
假如服务器返回的是统一数据格式:
/**
* 标准数据格式
* @param T
*/
public class ResponseT {
public int state;
public String message;
public T data;
}
网络异常导致的登录失败,在使用Retrofit+RxJava请求时都会直接调用subscribe的onError事件;
密码错误导致的登录失败,在使用Retrofit+RxJava请求时都会调用subscribe的onNext事件;
无论是异常还是错误,都要在subscribe里面处理异常信息,如下代码:
APIWrapper.getInstance().login(username, password)
.subscribe(new ObserverResponseUser() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(ResponseUser data) {
if(data.state == 1001){
//.....
}else if(data.state == 1002){
}
}
});
现在我希望在发生任何错误的情况下,都会调用onError事件,并且由model来处理错误信息。那么,此时我们就应该有一个ExceptionEngine来处理事件流中的错误信息了。
在工作流中处理异常
在正常情况下,我们获取网络数据的流程通常如下:
请求接口-解析数据-更新UI
整个数据请求过程都是发生在Rx中的工作流之中。当有异常产生的时候,我们要尽量不在ui层里面进行判断,换句话说,我们没有必要去告诉ui层具体的错误信息,只需要让他弹出一个信息(Toast或者Dialog)展示我们给它的信息就行。
请求接口和数据解析都可能出错,所以在这两层进行错误处理。为了更好的解耦,我们通过拦截器拦截错误,然后根据错误类型分发信息。
拦截器
数据解析层的拦截器
这个拦截器主要是为了获取具体的错误信息,分发给上层的UI,给用户以提示,增强用户体验。
public ObservableWeather getWeather(String cityName){
return weatherService.getWeather(cityName)
//拦截服务器返回的错误
.map(new ServerResponseFuncWeather())
//HttpResultFunc()为拦截onError事件的拦截器,后面会讲到,这里先忽略
.onErrorResumeNext(new HttpResponseFuncWeather());
}
//拦截固定格式的公共数据类型ResponseT,判断里面的状态码
private class ServerResponseFuncT implements Func1ResponseT, T {
@Override
public T call(ResponseT reponse) {
//对返回码进行判断,如果不是0,则证明服务器端返回错误信息了,便根据跟服务器约定好
显示全部