使用Rxjava2.0的过程中,难免会遇到链式请求,而链式请求一般都是第一个抛异常,那么后面的请求都是不会走的.现在来讨论一下链式请求的一种异常处理方法.
例如: 一个登录-->通过登录返回的token数据-->获取用户相关信息的链式请求
未处理代码如下:
1 retrofit.create(ApiService.class) 2 .login(userName, pwd) 3 .subscribeOn(Schedulers.io()) 4 .flatMap(new Function<LoginResponseInfo, ObservableSource<UserDetailInfo>>() { 5 @Override 6 public ObservableSource<UserDetailInfo> apply(LoginResponseInfo loginResponseInfo) throws Exception { 7 8 String authorization ="Bearer " + Base64.encodeToString(loginResponseInfo.getData().getToken().getBytes("UTF-8"), Base64.NO_WRAP); 9 10 return retrofit.create(ApiService.class) 11 .getUserInfo(authorization); 12 } 13 }).observeOn(AndroidSchedulers.mainThread()) 14 .subscribe(new Observer<UserDetailInfo>() { 15 @Override 16 public void onSubscribe(Disposable d) { 17 18 } 19 20 @Override 21 public void onNext(UserDetailInfo info) { 22 if (info.isSucceed()) { 23 Bundle bundle = new Bundle(); 24 bundle.putParcelable("userInfo", info.getData()); 25 startActivity(new Intent(LoginActivity.this, HomeActivity.class).putExtras(bundle)); 26 Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); 27 } else { 28 Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show(); 29 } 30 } 31 32 @Override 33 public void onError(Throwable e) { 34 //这里的异常根本不知道是如何处理 35 Toast.makeText(LoginActivity.this, "未知异常", Toast.LENGTH_SHORT).show(); 36 37 } 38 39 @Override 40 public void onComplete() { 41 42 } 43 });
处理过的代码如下:
1 retrofit.create(ApiService.class) 2 .login(userName, pwd) 3 .subscribeOn(Schedulers.io()) 4 .flatMap(new Function<LoginResponseInfo, ObservableSource<UserDetailInfo>>() { 5 @Override 6 public ObservableSource<UserDetailInfo> apply(LoginResponseInfo loginResponseInfo) throws Exception { 7 //这里做判断,如果登录请求返回的是失败,那么直接调用Observable.error()抛出特定类型的异常 8 if (!loginResponseInfo.isSucceed()){ 9 return Observable.error(new InvalidParameterException()); 10 } 11 String authorization ="Bearer " + Base64.encodeToString(loginResponseInfo.getData().getToken().getBytes("UTF-8"), Base64.NO_WRAP); 12 13 return RecordApplication.getRetrofit().create(ApiService.class) 14 .getUserInfo(authorization); 15 } 16 }).observeOn(AndroidSchedulers.mainThread()) 17 .subscribe(new Observer<UserDetailInfo>() { 18 @Override 19 public void onSubscribe(Disposable d) { 20 21 } 22 23 @Override 24 public void onNext(UserDetailInfo info) { 25 if (info.isSucceed()) { 26 Bundle bundle = new Bundle(); 27 bundle.putParcelable("userInfo", info.getData()); 28 startActivity(new Intent(LoginActivity.this, HomeActivity.class).putExtras(bundle)); 29 Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); 30 } else { 31 Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show(); 32 } 33 } 34 35 @Override 36 public void onError(Throwable e) { 37 // 然后根据刚刚定义的异常类型判断具体是哪个请求抛出的异常 38 if (e instanceof InvalidParameterException){ 39 Toast.makeText(LoginActivity.this, "用户名或密码错误,请重试", Toast.LENGTH_SHORT).show(); 40 }else{ 41 Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show(); 42 } 43 } 44 45 @Override 46 public void onComplete() { 47 48 } 49 });
处理的核心就是在第二次请求前用Observer.error()抛出第一次请求的异常,一旦第一次请求失败(我们认为的失败),那么不会进行第二次请求,直接会在Observer的回调中调用onError方法,
我们根据异常类型判断,如果是我们定义的特定异常,那么就说明第一次请求是失败的,异常在这里得到处理,后续请求不会再进行了.