我有一个api来电Completable
。如果Api调用成功,我必须清除一些临时数据库值(如果api调用失败,不要这样做)为了从db清除临时值,我有另一个Completable
方法。我最初做的是这样的。
apiCall()
.observeOn(Schedulers.io())
.doOnComplete(() -> clearTempDb())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
});
private Completable clearTempDb() {
return Completable.fromAction(() -> {
Log.d(TAG, "clear temp db started");
Thread.sleep(2000);
Log.d(TAG, "clear temp db completed");
}).subscribeOn(Schedulers.io());
}
private Completable apiCall() {
return Completable.fromAction(() -> Thread.sleep(2000)).subscribeOn(Schedulers.io());
}
然后我意识到在doOnComplete
调用只有clearTempDb()
不会工作,除非你订阅它。
所以我把它改成了
apiCall()
.observeOn(Schedulers.io())
.doOnComplete(() -> clearTempDb().subscribe())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
});
这样可行,但是clearTempDb
中发生的任何错误都不会成为主流的一部分,也不会传递给实际订阅者onError
然后我将clearTempDb
作为主要可观察链的一部分,如
apiCall().andThen(clearTempDb())
现在它按预期工作了。但问题是apiCall
和clearTempDb
已成为顺序问题。这意味着在完成这两项之后,只会调用onComplete
。但我不想等到clearTempDb
完成,才能完成我的主要观察。
我再次回到doOnComplete
并忽略错误
apiCall()
.doOnComplete(()->clearTempDb().onErrorComplete().subscribe())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.getMessage());
}
});
现在它的工作正常,但我不知道它是否是正确的解决方案。因为在许多教程中,我已经看到在doOnNext
,doOnComplete
或者此类中间事件中执行任何繁重的任务都不建议,因为它将在您的可观察链之外,并且它会中断活动的可观察链。那我怎么能以正确的方式做到这一点? apiCall().andThen(clearTempDb())
是推荐且唯一可能的方式吗?