将 RxJava observable 的错误转换为另一个 observable 并吞下成功
Transform RxJava observable's error into another observable and swallow success
如何将 observable 的错误转换为另一个 observable?
我正在尝试实现以下方案中显示的算法:
我正在使用名为 Grokking RxJava 的教程开始我的学习,发现 flatMap 运算符可以将一个 Observable returning 通过 Retrofit 转换为另一个 Observable returning ,这允许我执行服务器方法的一系列调用。但在教程链接方法中总是 return 成功结果。 如果其中一个远程方法 return 出错,我如何进行相同的链接?
目前我使用的方法对我来说很奇怪且不清楚:
AppObservable.bindActivity(this, userService.checklogin(mPhone)
.onErrorResumeNext(new Func1<Throwable, Observable<? extends Response>>() {
@Override
public Observable<? extends Response> call(Throwable throwable) {
return Observable.just(null);
}
}))
.flatMap(new Func1<Response, Observable<Response>>() {
@Override
public Observable<Response> call(Response response) {
if (response == null) {
return AppObservable.bindActivity(RegistrationActivity.this, userService.register(
mPhone,
name.getText().toString(),
selectedSex,
selectedDateDay,
selectedDateMonth,
selectedDateYear,
Locale.getDefault().getLanguage(),
persistentUserInfoStore.getInstallationToken()
));
}
phone.setError(getString(R.string.already_registered_phone));
progressDialog.dismiss();
return Observable.empty();
}
})
.subscribe(new Action1<Response>() {
@Override
public void call(Response response) {
startConfirmationActivity();
progressDialog.dismiss();
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
progressDialog.dismiss();
Toast.makeText(RegistrationActivity.this, "Error while register user", Toast.LENGTH_SHORT).show();
}
});
有没有更明确的方法来做到这一点。
P.S。我是 RxJava 的新手。
- 您应该从
onErrorResumeNext
调用 userService.register
- 区分发生哪种错误的最简单方法是为每个错误引入一个单独的
Exception
class。
这是它在代码中的样子:
userService.checkLogin(mPhone).flatMap(new Func1<Response, Observable<Response>() {
@Override
public Observable<? extends Response> call(final Response response) {
// according to your diagram the whole Observable should fail if first call was successful
return Observable.error(new FirstCallWasSuccessfulException(response));
}
}).onErrorResumeNext(new Func1<Throwable, Observable<? extends Response>>() {
@Override
public Observable<? extends Response> call(final Throwable throwable) {
if (throwable instanceof FirstCallWasSuccessfulException) {
return Observable.error(throwable);
}
return userService.register(...);
}
}).subscribe(new Subscriber<Response>() {
@Override
public void onError(final Throwable throwable) {
if (throwable instanceof FirstCallWasSuccessfulException) {
// foo
} else {
// bar
}
}
@Override
public void onNext(final Response response) {
}
@Override
public void onCompleted() {
}
});
如何将 observable 的错误转换为另一个 observable?
我正在尝试实现以下方案中显示的算法:
我正在使用名为 Grokking RxJava 的教程开始我的学习,发现 flatMap 运算符可以将一个 Observable returning 通过 Retrofit 转换为另一个 Observable returning ,这允许我执行服务器方法的一系列调用。但在教程链接方法中总是 return 成功结果。 如果其中一个远程方法 return 出错,我如何进行相同的链接?
目前我使用的方法对我来说很奇怪且不清楚:
AppObservable.bindActivity(this, userService.checklogin(mPhone)
.onErrorResumeNext(new Func1<Throwable, Observable<? extends Response>>() {
@Override
public Observable<? extends Response> call(Throwable throwable) {
return Observable.just(null);
}
}))
.flatMap(new Func1<Response, Observable<Response>>() {
@Override
public Observable<Response> call(Response response) {
if (response == null) {
return AppObservable.bindActivity(RegistrationActivity.this, userService.register(
mPhone,
name.getText().toString(),
selectedSex,
selectedDateDay,
selectedDateMonth,
selectedDateYear,
Locale.getDefault().getLanguage(),
persistentUserInfoStore.getInstallationToken()
));
}
phone.setError(getString(R.string.already_registered_phone));
progressDialog.dismiss();
return Observable.empty();
}
})
.subscribe(new Action1<Response>() {
@Override
public void call(Response response) {
startConfirmationActivity();
progressDialog.dismiss();
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
progressDialog.dismiss();
Toast.makeText(RegistrationActivity.this, "Error while register user", Toast.LENGTH_SHORT).show();
}
});
有没有更明确的方法来做到这一点。
P.S。我是 RxJava 的新手。
- 您应该从
onErrorResumeNext
调用 - 区分发生哪种错误的最简单方法是为每个错误引入一个单独的
Exception
class。
userService.register
这是它在代码中的样子:
userService.checkLogin(mPhone).flatMap(new Func1<Response, Observable<Response>() {
@Override
public Observable<? extends Response> call(final Response response) {
// according to your diagram the whole Observable should fail if first call was successful
return Observable.error(new FirstCallWasSuccessfulException(response));
}
}).onErrorResumeNext(new Func1<Throwable, Observable<? extends Response>>() {
@Override
public Observable<? extends Response> call(final Throwable throwable) {
if (throwable instanceof FirstCallWasSuccessfulException) {
return Observable.error(throwable);
}
return userService.register(...);
}
}).subscribe(new Subscriber<Response>() {
@Override
public void onError(final Throwable throwable) {
if (throwable instanceof FirstCallWasSuccessfulException) {
// foo
} else {
// bar
}
}
@Override
public void onNext(final Response response) {
}
@Override
public void onCompleted() {
}
});