/ / Opublikuj do określonego obserwatora, używając PublishSubject - android, rx-android, rx-java2

Opublikuj do określonego obserwatora, używając PublishSubject - android, rx-android, rx-java2

mam ViewPager z dwiema stronami mianowicie Popularny i Wszystko. To, co próbuję osiągnąć, to tylko elementy typu "push", które mają przypisany popularny tag Popularny natomiast popchnij wszystkie przedmioty do Wszystko.

Obecnie mam jedną klasę, która jest używana w PagerAdapter i przekazywanie w typie strony. Jak mogę odfiltrować PublishSubject aby każda strona wyświetlała tylko niezbędne elementy.

Obaj moi obserwatorzy zapisali się do singla PublishSubject, ale ja chcesz filtrować podczas emitowania.

Prosimy o komentarz, jeśli pytanie jest niejasne. Zrobię co w mojej mocy, aby przekazać ten problem. Przykro mi, jeśli odpowiedź została już udzielona, ​​ponieważ nie mogłem znaleźć niczego istotnego.

Kod, którego używam, to to oparte na ta architektura w której mam magazyn danych Firebase FirebaseSubscriptionDataStore który zapewnia PublishSubject. To jest później subskrybowane przez SubskrybujToSubscriptionUpdates w SubscriptionListPresenterImpl

Z góry dziękuję.

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz zasadniczo zdefiniować dwie różne metody Observable (lub Flowable) z PublishSubject. Pierwsze obserwowalne będą emitować wszystkie przedmioty, a drugie - tylko popularne:

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

Jeśli nie chcesz dwóch metod, możesz się przenieść .filter() operator wszędzie w twoim łańcuchu Rx i możesz skończyć z czymś takim:

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