我是RxJava的新手。我想从给定的集合中为每个TempoAccount
实体下载一些数据,并将其全部存储在地图accountsWithProjects
中。当最后一个onNext(TempoAccount tempoAccount)
的代码完成时,我想调用filterAccountsWithProjects(accountsWithProjects)
方法。有一些简单的方法可以实现吗?
private void getProjectsForEachTempoAccount(Collection<TempoAccount> tempoAccounts) {
final Map<TempoAccount, Collection<TempoProject>> accountsWithProjects =
new HashMap<>(tempoAccounts.size());
Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts);
accountsObservable
.compose(ObservableUtils.applySchedulers())
.subscribe(new ObserverAdapter<TempoAccount>() {
@Override
public void onError(Throwable e) {
view.notifyAboutError(e.getMessage());
}
@Override
public void onNext(TempoAccount tempoAccount) {
jira.requestProjectsInfoForTempoAccount(String.valueOf(tempoAccount.getId()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ObserverAdapter<Collection<TempoProject>>() {
@Override
public void onError(Throwable e) {
view.notifyAboutError(e.getMessage());
}
@Override
public void onNext(Collection<TempoProject> projects) {
accountsWithProjects.put(tempoAccount, projects);
}
});
}
@Override
public void onCompleted() {
filterAccountsWithProjects(accountsWithProjects);
}
});
}
问题:在完成来自
filterAccountsWithProjects(accountsWithProjects)
的所有可观察对象之前,触发了onNext(TempoAccount tempoAccount)
以上的代码。编辑:
我想创建一个这样的Observable:
Observable<Map<TempoAccount, Collection<TempoProject>>
。我给出了两个观察值:
Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts)
Observable<Collection<TempoProject>> projectsForAccountObservable = jira.requestProjectsInfoForTempoAccount(TempoAccount account)
所以我的问题是:我可以以某种方式连接它们并创建包含这两个可观察对象的地图。
最佳答案
您应该在原始流上使用flatMap()
函数来执行当前在onNext()
中正在执行的操作。另外,您无需在onComplete()
中过滤流。您可以在流本身上使用filter()
并以更“主动”的方式处理问题。
这是一个例子:
accountsObservable
.compose(ObservableUtils.applySchedulers())
.map(tempoAccount -> new Pair<TempoAccount, Collection<TempoProject>>(tempoAccount, fetchInfoAccountForTempoAccount(tempoAccount)))
.filter(pair -> hasProjects(pair))
.toMap(pair -> pair.first(), pair -> pair.second)
.subscribe(...)
编辑:
更新了建议的答案-得到
TempoAccount
,然后将每个帐户映射到帐户的Pair
和TempoProject
的集合。您可以过滤对以查看是否有任何项目,然后使用toMap()
创建所需的结果。请注意,要使toMap()
正常工作,可观察对象必须在到达流的末尾时调用onComplete()
。关于java - 上一个onNext()执行的RxJava回调完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38182708/