代码之家  ›  专栏  ›  技术社区  ›  Ritesh Shakya

使用PublishSubject发布给特定观察者

  •  0
  • Ritesh Shakya  · 技术社区  · 9 年前

    我有一个 ViewPager 受喜爱的 和 全部的 受喜爱的 然而,将所有项目推送到 全部的 .

    目前,我有一个类,用于 PagerAdapter 并传入页面类型。如何过滤掉 PublishSubject

    ,但我

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

    this 基于 this architecture 其中我有一个Firebase数据存储 FirebaseSubscriptionDataStore . 稍后由订阅 SubscribeToSubscriptionUpdates SubscriptionListPresenterImpl

    提前谢谢。

    1 回复  |  直到 9 年前
        1
  •  2
  •   skywall    9 年前

    基本上可以定义两种不同的方法来获取 Observable PublishSubject . 第一个observable将发射所有项目,第二个仅发射流行项目:

    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;
            }
        }
    }
    

    如果你不想使用两种方法,你可以移动 .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();