我有一个加载页面,我想在其中执行两个网络请求(retrofit2-rxjava),以获取不相关的信息。在这两个请求完成之前,即使一个或两个都失败,我也不想继续下一页。
使用zip将请求捆绑在一起。有没有一种方法不被迫使用BiFunction并且不必返回null?
请求A和B具有.doOnNext和.doOnError。如果其中之一返回错误,可观察到的zip会继续吗? zip订阅者还会返回错误吗?
这是最好的方法吗?
private Disposable retrieveBothThings() {
return Observable.zip(getThingA(), getThingB(),
(A, B) -> {
onAllCallsComplete();
return null;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(o -> {}, Logger::e);
}
private Observable<...> getThingA() {
return SessionManager.getInstance().getApi()
.getA()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(this::onACompleted)
.doOnError(this::onAFailed);
}
private Observable<...> getThingB() {
return SessionManager.getInstance().getApi()
.getB()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).toObservable()
.doOnNext(this::onBSuccess)
.doOnError(this::onBFailure);
}
private void onBSuccess(...) {
...
}
private void onBFailure(final Throwable throwable) {
Logger.e(throwable);
}
private void onACompleted(...) {
...
}
private void onAFailed(final Throwable throwable) {
Logger.e(throwable);
}
答案 0 :(得分:1)
您可以使用merge()
运算符组合两个可观察对象。您可以使用onComplete()
将错误转换为onErrorResumeNext()
。
Completable.merge(
observable1
.doOnNext(this::onACompleted)
.doOnError(this::onAFailed)
.onErrorResumeNext( Completable.complete() )
.toCompletable(),
observable2
.doOnNext(this::onBCompleted)
.doOnError(this::onBFailed)
.onErrorResumeNext( Completable.complete() ),
.toCompletable() )
.subscribe( ignore -> {},
error -> {},
() -> { processCompletion(); } );