【发布时间】:2017-04-12 08:21:11
【问题描述】:
我想在其他一些 observable 发出新项目(触发器)时加载下一个项目。
这是发出项目的代码:
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);
});
}
});
}
触发 Observable:
RxView.clicks(view.findViewById(R.id.button_more)).debounce(500, TimeUnit.MILLISECONDS);
我可以解决这个问题的唯一方法是使用 Subject 并持有对不优雅且似乎没有反应性的 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的发出计数。跨度> -
所以你从 api 加载一个 id 列表,并且你想在单击按钮时为下一个 id 加载数据?或者你想用数据再次加载 id?
-
@Lamorak 是的,这就是我想要做的。我不想再次加载 ID。
-
@Pedram 您可以通过平面图传递该 ID。像 RxView.clicks(view).flatmap(ignore -> Observable.defer(get()));
标签: java android rx-java rx-java2