在onComplete

时间:2017-10-26 16:00:18

标签: android rx-java rx-java2

我有一个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())

现在它按预期工作了。但问题是apiCallclearTempDb已成为顺序问题。这意味着在完成这两项之后,只会调用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());
                }
            });

现在它的工作正常,但我不知道它是否是正确的解决方案。因为在许多教程中,我已经看到在doOnNextdoOnComplete或者此类中间事件中执行任何繁重的任务都不建议,因为它将在您的可观察链之外,并且它会中断活动的可观察链。那我怎么能以正确的方式做到这一点? apiCall().andThen(clearTempDb())是推荐且唯一可能的方式吗?

0 个答案:

没有答案