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

标签 java android synchronization rx-java

我是 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>> 。 我给出了两个可观察量:

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

  2. 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/

相关文章:

Android:本地化标准文本,例如 OK、CANCEL 和 GPS 未激活 - 例如?

android - 什么可能导致 TextView 上的 setText 出现 ANR?

java - 我如何监控另一个应用程序的数据库变化?

c - OpenMP - 如何高效同步字段更新

java - 两个方法会同时执行吗

java - 如果构造函数中的参数太多,是否会产生性能问题?

java - 如何在java,android中将sql日期格式化为Simpledateformat?

java - 从 POJO 获取注解 hibernate 表名

javascript - AngularJS:WAITING异步调用

java - 在 libgdx gwt Web 应用程序中找不到字体文件