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 });
处理过的代码如下:
 retrofit.create(ApiService.class)
.login(userName, pwd)
.subscribeOn(Schedulers.io())
.flatMap(new Function<LoginResponseInfo, ObservableSource<UserDetailInfo>>() {
@Override
public ObservableSource<UserDetailInfo> apply(LoginResponseInfo loginResponseInfo) throws Exception {
        //这里做判断,如果登录请求返回的是失败,那么直接调用Observable.error()抛出特定类型的异常
if (!loginResponseInfo.isSucceed()){
return Observable.error(new InvalidParameterException());
}
String authorization ="Bearer " + Base64.encodeToString(loginResponseInfo.getData().getToken().getBytes("UTF-8"), Base64.NO_WRAP); return RecordApplication.getRetrofit().create(ApiService.class)
.getUserInfo(authorization);
}
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UserDetailInfo>() {
@Override
public void onSubscribe(Disposable d) { } @Override
public void onNext(UserDetailInfo info) {
if (info.isSucceed()) {
Bundle bundle = new Bundle();
bundle.putParcelable("userInfo", info.getData());
startActivity(new Intent(LoginActivity.this, HomeActivity.class).putExtras(bundle));
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
}
} @Override
public void onError(Throwable e) {
        // 然后根据刚刚定义的异常类型判断具体是哪个请求抛出的异常
if (e instanceof InvalidParameterException){
Toast.makeText(LoginActivity.this, "用户名或密码错误,请重试", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(LoginActivity.this, "网络异常,请稍后再试", Toast.LENGTH_SHORT).show();
}
} @Override
public void onComplete() { }
});

 处理的核心就是在第二次请求前用Observer.error()抛出第一次请求的异常,一旦第一次请求失败(我们认为的失败),那么不会进行第二次请求,直接会在Observer的回调中调用onError方法,

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

上一篇:【poj1080】 Human Gene Functions


下一篇:RobotFramework-关键字