我是 RxJava 新手。我想为每个 TempoAccount
下载一些数据给定集合中的实体并将其全部存储在 map 中 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)
所以我的问题是:我能否以某种方式连接它们并创建具有这两个可观察量的 map 。
最佳答案
您应该在原始流上使用 flatMap()
函数来执行您当前在 onNext()
中执行的操作。此外,您不需要在 onComplete()
中过滤流。您可以在流本身上使用 filter()
并以更“响应式(Reactive)”的方式处理问题。
这是一个例子:
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/