使用PublishSubject发布到特定的Observer

时间:2017-09-23 14:37:21

标签: android rx-android rx-java2

我有ViewPager有两页,即热门全部。我想要实现的目标只是将热门标签推送到热门,而将所有项目推送到全部

目前我有一个在PagerAdapter中使用并传入页面类型的类。如何过滤掉PublishSubject,以便每个页面仅相应地显示必要的项目。

  

我的Observer都订阅了一个PublishSubject,但是我   想要在发光时过滤。

如果问题不清楚,请发表评论。我会尽力传达这个问题。如果它已经被回答,也很抱歉,因为我找不到任何相关内容。

我使用的代码this基于this architecture,其中我有一个Firebase数据存储FirebaseSubscriptionDataStore,提供PublishSubject。稍后由SubscribeToSubscriptionUpdates

中的SubscriptionListPresenterImpl订阅

提前致谢。

1 个答案:

答案 0 :(得分:2)

您基本上可以定义两种不同的方法来从Observable获取PublishSubject(或Flowable)。第一个可观察物将发射所有物品,第二个仅发射受欢迎物品:

public class DataStore {

    private PublishSubject<DataItem> dataItemPublishSubject = PublishSubject.create();

    public Flowable<DataItem> getAllObservable() {
        return dataItemPublishSubject.toFlowable(BackpressureStrategy.BUFFER);
    }

    public Flowable<DataItem> getPopularObservable() {
        return dataItemPublishSubject.toFlowable(BackpressureStrategy.BUFFER)
                .filter(new Predicate<DataItem>() {
                    @Override
                    public boolean test(DataItem dataItem) throws Exception {
                        return dataItem.popular;
                    }
                });
    }

    public static class DataItem {
        public final boolean popular;

        public DataItem(boolean popular) {
            this.popular = popular;
        }
    }
}

如果您不想使用两种方法,可以在您的Rx链中的任何地方移动.filter()运算符,最终可能会出现以下情况:

    dataStore.getAllObservable()
            .doOnNext(new Consumer<DataStore.DataItem>() {
                @Override
                public void accept(DataStore.DataItem dataItem) throws Exception {
                    pagerAdapter.addDataAll(dataItem);      
                }
            })
            .filter(new Predicate<DataStore.DataItem>() {
                @Override
                public boolean test(DataStore.DataItem dataItem) throws Exception {
                    return dataItem.popular;
                }
            })
            .doOnNext(new Consumer<DataStore.DataItem>() {
                @Override
                public void accept(DataStore.DataItem dataItem) throws Exception {
                    pagerAdapter.addDataPopular(dataItem);
                }
            })
            .subscribe();