我想在某些其他observable發出新項目(觸發器)時加載下一個項目。RxJava按需加載項目
這是發出的物品代碼:
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);
});
}
});
}
觸發可觀察:使用Subject
並保持到列表的引用
RxView.clicks(view.findViewById(R.id.button_more)).debounce(500, TimeUnit.MILLISECONDS);
我能解決這個問題的唯一辦法是這不是優雅而且看起來沒有反應的ID。
編輯:這是我的解決方案,但我不得不直接訂閱觸發事件。我不認爲它優雅。
@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;
}
});
}
爲您的clickObservable使用平面地圖。 –
@PhoenixWang這就是我用'Subject'方法做的事情,問題是每當觸發器發出一個新項目時如何從'idApi'獲得'n'個發射計數。 – Pedram
所以你加載一個API列表,你想加載數據的下一個ID時點擊一個按鈕?或者你想用數據再次加載ID? – Lamorak