最后onNext()执行的RxJava回调完成

时间:2016-07-04 10:40:16

标签: java android synchronization rx-java

我是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>>。 我有两个可观测量:

  1. Observable<TempoAccount> accountsObservable = Observable.from(tempoAccounts)

  2. Observable<Collection<TempoProject>> projectsForAccountObservable = jira.requestProjectsInfoForTempoAccount(TempoAccount account)

  3. 所以我的问题是:我可以用某种方式连接它们并创建具有这两个可观察量的地图。

1 个答案:

答案 0 :(得分:1)

您应该使用原始信息流上的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()