Ich möchte den/die nächsten Artikel laden, wenn ein anderes Observable einen neuen Gegenstand (einen Auslöser) auslöst.RxJava Artikel auf Anfrage laden
Dies ist der Code, der die Elemente emittiert: Ich konnte dieses Problem umgehen, war mit einem Subject
und hält einen Verweis auf eine Liste von
RxView.clicks(view.findViewById(R.id.button_more)).debounce(500, TimeUnit.MILLISECONDS);
Der einzige Weg:
public Observable<Item> get() {
return idApi.get().flatMap(new Function<List<String>, ObservableSource<String>>() {
@Override
public ObservableSource<String> apply(@NonNull List<String> ids) throws Exception {
return Observable.fromIterable(ids);
}
}).flatMap(new Function<String, ObservableSource<Item>>() {
@Override
public ObservableSource<Item> apply(@NonNull final String id) throws Exception {
return dataApi.get(id).map(new Function<Data, Item>() {
@Override
public Item apply(@NonNull Data data) throws Exception {
return new Item(data , id);
});
}
});
}
Trigger-Observable ids, die nicht elegant war und nicht reagierte.
Edit: Das ist meine Lösung bisher, aber ich musste abonnieren Ereignis direkt zu abonnieren. Ich halte das nicht für elegant.
@Override
public Observable<Item> get(final Observable<Object> trigger) {
final PublishSubject<Item> subject = PublishSubject.create();
return idApi.get().flatMap(new Function<List<String>, ObservableSource<Queue<String>>>() {
@Override
public ObservableSource<Queue<String>> apply(@NonNull List<String> ids) throws Exception {
final Queue<String> q = new LinkedList<>(ids);
return Observable.just(q);
}
}).flatMap(new Function<Queue<String>, ObservableSource<Item>>() {
@Override
public ObservableSource<Item> apply(@NonNull final Queue<String> ids) throws Exception {
trigger.subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Object>() {
@Override
public void accept(@NonNull Object o) throws Exception {
if (ids.size() > 0) {
final String id = ids.poll();
dataApi.get(id).map(new Function<Data, Item>() {
@Override
public Item apply(@NonNull Data data) throws Exception {
return new Item(data, id) l
}
}).subscribe(new Consumer<Item>() {
@Override
public void accept(@NonNull Item item) throws Exception {
subject.onNext(item);
}
});
} else {
subject.onComplete();
}
}
});
return subject;
}
});
}
Verwenden Sie eine Flatmap für Ihre clickObservable. –
@PhoenixWang Dies ist, was ich mit dem 'Subject' Ansatz mache, das Problem ist, wie man' n' Zählimpulse von 'idApi' erhält, wenn der Auslöser einen neuen Gegenstand aussendet. – Pedram
Also laden Sie eine Liste von IDs aus API und möchten Daten für nächste ID laden, wenn auf eine Schaltfläche geklickt wird? oder willst du die ids nochmal mit den daten laden? – Lamorak