/ / Publikujte na konkrétneho pozorovateľa pomocou PublishSubject - android, rx-android, rx-java2

Publikujte na konkrétny Observer pomocou PublishSubject - android, rx-android, rx-java2

mám ViewPager s dvoma stránkami populárne a všetko, To, čo sa snažím dosiahnuť, je len tlačiť položky, ktoré majú populárnu značku pravdivú populárne zatiaľ čo tlačiť všetky položky všetko.

Momentálne mám jednu triedu, ktorá sa používa v PagerAdapter a odovzdanie typu stránky. Ako sa filtrovať PublishSubject aby každá stránka zobrazovala iba potrebné položky.

Obaja moji pozorovatelia sa prihlásia na odber jedného PublishSubject, ale ja chcieť filtrovať pri emitovaní.

Prosím, pripomienkujte, ak je otázka nejasná. Pokúsim sa čo najlepšie preniesť tento problém. Rovnako aj ľúto, ak už bola odpoveď, pretože som nenašiel nič relevantné.

Kód, ktorý používam, je toto založené na tejto architektúre v ktorom mám Firebase dátový obchod FirebaseSubscriptionDataStore ktorý poskytuje PublishSubject, Toto sa neskôr prihlási SubscribeToSubscriptionUpdates v SubscriptionListPresenterImpl

Vopred ďakujem.

odpovede:

1 pre odpoveď č. 1

V podstate môžete definovať dve rôzne metódy Observable (alebo tekuté) od PublishSubject, Prvé pozorovateľné budú emitovať všetky položky a druhá len populárne:

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

V prípade, že nechcete mať dve metódy, môžete sa pohybovať .filter() operátora všade vo vašom reťazci Rx a môžete skončiť s niečím takým:

    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();