RxJava Chaining Observables with flatmap / concatmap&观察线程

时间:2017-07-19 22:27:10

标签: android rx-java rx-java2

以下代码......

  • 观察来自Android ViewPager的两个整数流(pageSelected,scrollState)。

  • 结合&过滤流寻找某种组合。

  • 如果找到,则执行网络呼叫。

  • 消耗网络电话的结果。

问题

1。 flatmap()/ concatmap()是下面代码链接Observables的唯一方法吗?(避免嵌套subscribe()调用)

2。使用observeOn()在平面代码中切换正确/直观的线程还是有更好的方法来做到这一点?(DataTools调用是异步的)

我发现在使用嵌套代码时,在Observable,Operator和Subscriber之间应用正确的线程会让人感到困惑。

平面版

public void loadNextAtTest4(final int pagesRemaining) {
    ObservableCombineLatest.combineLatest(pageSelectObs, scrollStateObs, new BiFuncOnlyIdlePages()).filter(new Predicate<Integer>() {
        @Override
        public boolean test(@NonNull Integer page) throws Exception {
            return page > -1 && pagesRemaining == page;
        }
    }).observeOn(Schedulers.io())
            .flatMap(new Function<Integer, Observable<List<PageDescriptor>>>() {
        @Override
        public Observable<List<PageDescriptor>> apply(@NonNull Integer integer) throws Exception {
            return DataTools.getNextPageBase(mRedClient, mFpxClient).toObservable();
        }
    }).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<List<PageDescriptor>>() {
        @Override
        public void accept(@NonNull List<PageDescriptor> pageDescriptors) throws Exception {
            mCPAdapter.appendDataset(pageDescriptors);
        }
    });
}

嵌套版本

public void loadNextAtTest2(final int pagesRemaining) {
    ObservableCombineLatest.combineLatest(pageSelectObs, scrollStateObs, new BiFuncOnlyIdlePages()).filter(new Predicate<Integer>() {
        @Override
        public boolean test(@NonNull Integer page) throws Exception {
            return page > -1 && pagesRemaining == page;
        }
    }).observeOn(Schedulers.io())
            .subscribe(new Consumer<Integer>() {
        @Override
        public void accept(@NonNull Integer page) throws Exception {
            DataTools.getNextDataBase(mRedClient, mFpxClient)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer<List<PageDescriptor>>() {
                        @Override
                        public void accept(@NonNull List<PageDescriptor> pageDescriptors) throws Exception {
                            mCPAdapter.appendDataset(pageDescriptors);
                        }
                    });
        }
    });
}

0 个答案:

没有答案