我是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,然后将每个帐户映射到帐户的PairTempoProject的集合。您可以过滤对以查看是否有任何项目,然后使用toMap()创建所需的结果。请注意,要使toMap()正常工作,可观察对象必须在到达流的末尾时调用onComplete()

关于java - 上一个onNext()执行的RxJava回调完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38182708/

10-09 00:27