文档详情

Retrofit+RxJava优雅的处理服务器返回异常、错误概要.doc

发布:2017-03-04约1.55万字共14页下载文档
文本预览下载声明
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,则证明服务器端返回错误信息了,便根据跟服务器约定好
显示全部
相似文档