Rxjava2.0 链式请求异常处理

使用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方法,

我们根据异常类型判断,如果是我们定义的特定异常,那么就说明第一次请求是失败的,异常在这里得到处理,后续请求不会再进行了.

    原文作者:你要
    原文地址: https://www.cnblogs.com/fuyaozhishang/p/8697404.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞