Rxjava2.0 链式请求异常处理

本文介绍RxJava2.0中链式请求的异常处理方法。通过示例展示如何在登录请求失败时提前终止链式操作并抛出特定异常,以便在观察者中进行针对性处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值