如何避免嵌套订阅

时间:2018-01-04 11:50:17

标签: rx-java2

我有这个方法deleteFeedTable(),它返回Completable,当它完成时,我想开始另一个Disposable

我所做的是使用运算符concatWith组合两个,但这导致嵌套订阅,我希望避免这种情况。

disposables.add(
                localDataSource.deleteFeedTable()
                        .doOnComplete(() -> {                                preferencesManager.setFeedTableUpdateState(false);
                        })
                        .concatWith(new Completable() {
                            @Override
                            protected void subscribeActual(CompletableObserver s) {   
                             s.onSubscribe(localDataSource.getLastStoredId()
                                        .flatMap(lastStoredId -> remoteDataSource.getFeed(lastStoredId))
                                        .doOnNext(feedItemList -> localDataSource.saveFeed(feedItemList))
                                        .map(feedItemList -> {
                                            Timber.i("MESA STO MAP");
                                            List<Feed> feedList = new ArrayList<>();
                                            for (FeedItem feedItem : feedItemList) {
                                                feedList.add(mapper.from(feedItem));
                                            }
                                            downloadImageUseCase.downloadPhotos(feedList);
                                            return feedList;
                                        })
                                        .subscribe());
                            }
                        })
                        .subscribeOn(schedulerProvider.io())
                        .observeOn(schedulerProvider.mainThread())
                        .subscribe(() -> {}, throwable -> Log.i("THROW", "loadData ", throwable)));

有没有办法可以避免嵌套订阅?或者是否有另一种方法将其添加到一次性变量中,以便我可以稍后清除订阅?

1 个答案:

答案 0 :(得分:3)

使用andThen

disposables.add(
    localDataSource.deleteFeedTable()
        .doOnComplete(() -> {
            preferencesManager.setFeedTableUpdateState(false);
        })
        .andThen(
            localDataSource.getLastStoredId()
                .flatMap(lastStoredId -> remoteDataSource.getFeed(lastStoredId))
                .doOnNext(feedItemList -> localDataSource.saveFeed(feedItemList))
                .map(feedItemList -> {
                    Timber.i("MESA STO MAP");
                    List<Feed> feedList = new ArrayList<>();
                    for (FeedItem feedItem : feedItemList) {
                        feedList.add(mapper.from(feedItem));
                    }
                    downloadImageUseCase.downloadPhotos(feedList);
                    return feedList;
                })
        )
        .subscribeOn(schedulerProvider.io())
        .observeOn(schedulerProvider.mainThread())
        .subscribe(() -> {}, throwable -> Log.i("THROW", "loadData ", throwable)));