- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RetrofitRxJava优雅的处理服务器返回异常、错误选编
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,则证明服务器端返回错误信息了,便根据跟服务器约定好的错误码去解析异常
if (reponse.state !=
文档评论(0)