admin 发表于 2017-5-11 16:12:43

Retrofit+RxJava 优雅地处理服务器返回的错误和客户端访问网络过程中产生的错误

开始本博客之前,请先阅读:
Retrofit请求数据对错误以及网络异常的处理异常&错误实际开发经常有这种情况,比如登录请求,接口返回的
信息包括请求返回的状态:失败还是成功,错误码,User对象等等。如果网络等原因引起的登录失败可以归结为异常,如果是用户信息输入错误导致的登录失败算是错误。假如服务器返回的是统一数据格式:/**
* 标准数据格式
* @param <T>
*/
public class Response<T> {
    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 Observer<Response<User>>() {
                  @Override
                  public void onCompleted() {

                  }

                  @Override
                  public void onError(Throwable e) {

                  }

                  @Override
                  public void onNext(Response<User> data) {
                        if(data.state == 1001){
                            //.....
                        }else if(data.state == 1002){

                        }
                  }
                });现在我希望在发生任何错误的情况下,都会调用onError事件,并且由model来处理错误信息。那么,此时我们就应该有一个ExceptionEngine来处理事件流中的错误信息了。在工作流中处理异常在正常情况下,我们获取网络数据的流程通常如下:请求接口->解析数据->更新UI整个数据请求过程都是发生在Rx中的工作流之中。当有异常产生的时候,我们要尽量不在ui层里面进行判断,换句话说,我们没有必要去告诉ui层具体的错误信息,只需要让他弹出一个信息(Toast或者Dialog)展示我们给它的信息就行。请求接口和数据解析都可能出错,所以在这两层进行错误处理。为了更好的解耦,我们通过拦截器拦截错误,然后根据错误类型分发信息。拦截器数据解析层的拦截器这个拦截器主要是为了获取具体的错误信息,分发给上层的UI,给用户以提示,增强用户体验。public Observable<Weather> getWeather(String cityName){
      return weatherService.getWeather(cityName)
                //拦截服务器返回的错误
                .map(new ServerResponseFunc<Weather>())
                //HttpResultFunc()为拦截onError事件的拦截器,后面会讲到,这里先忽略
                .onErrorResumeNext(new HttpResponseFunc<Weather>());
    }
//拦截固定格式的公共数据类型Response<T>,判断里面的状态码
private class ServerResponseFunc<T> implements Func1<Response<T>, T> {
      @Override
      public T call(Response<T> reponse) {
            //对返回码进行判断,如果不是0,则证明服务器端返回错误信息了,便根据跟服务器约定好的错误码去解析异常
            if (reponse.state != 0) {
            //如果服务器端有错误信息返回,那么抛出异常,让下面的方法去捕获异常做统一处理
                throw new ServerException(reponse.state,reponse.message);
            }
            //服务器请求数据成功,返回里面的数据实体
            return reponse.data;
      }
    }所以整个逻辑是这样的:
http://img.blog.csdn.net/20160711175015033所以在前三步的过程中,只要发生异常(服务器返回的错误也抛出了)都会抛出,这时候就触发了RxJava的OnError事件。处理onError事件的拦截器这个拦截器主要是将异常信息转化为用户”能看懂”的友好提示。 private class HttpResponseFunc<T> implements Func1<Throwable, Observable<T>> {
      @Override
      public Observable<T> call(Throwable throwable) {
            //ExceptionEngine为处理异常的驱动器
            return Observable.error(ExceptionEngine.handleException(throwable));
      }
    }原始地址:
http://blog.csdn.net/jdsjlzx/article/details/51882661

页: [1]
查看完整版本: Retrofit+RxJava 优雅地处理服务器返回的错误和客户端访问网络过程中产生的错误