【问题标题】:RxJava callback for last onNext() execution finished最后一次 onNext() 执行的 RxJava 回调完成
【发布时间】:2016-07-04 10:40:15
【问题描述】:

我是 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&lt;Map&lt;TempoAccount, Collection&lt;TempoProject&gt;&gt;。 我有两个 observables:

  1. Observable&lt;TempoAccount&gt; accountsObservable = Observable.from(tempoAccounts)

  2. Observable&lt;Collection&lt;TempoProject&gt;&gt; projectsForAccountObservable = jira.requestProjectsInfoForTempoAccount(TempoAccount account)

所以我的问题是:我能否以某种方式连接它们并创建具有这两个可观察对象的地图。

【问题讨论】:

    标签: java android synchronization rx-java


    【解决方案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(...)
    

    编辑:

    更新了建议的答案 - 您将获得 TempoAccounts,然后将每个帐户映射到帐户的 PairTempoProjects 的集合。您过滤这些对以查看您是否有任何项目,然后使用toMap() 创建您想要的结果。请注意,要让 toMap() 正常工作,您的 observable 必须在到达流末尾时调用 onComplete()

    【讨论】:

    • flatMap() 删除有关 TempoAccount 对象的信息。我最后需要的是收集这样的TempoAccount 对象,与它们相关联的Collection&lt;TempoProject&gt; 包含具有所需key 值(某些字段)的TempoProject 对象。不知道它是否足够清楚:)
    • 视情况而定。 flatMap() 可以为一个值生成一个全新的流,map() 将这个值转换为一个新的值。这完全取决于您的用例:)
    • 我想将TempoAccount 对象流转换为Map.Entry&lt;TempoAccount, Collection&lt;TempoProject&gt;&gt; 流。是否有一些转换方法可以实现这一点,将Observable&lt;TempoAccount&gt; 作为参数? map() 方法直接采用 Map.Value 类型,所以它不是我的选择。
    • 您的方法需要的确切结果是什么?
    • 我收集了TempoAccount 对象。对于每个对象,我想获取 TempoProject 对象的集合并放入 Map。最后我想得到Map&lt;TempoAccount, Collection&lt;TempoProject&gt;&gt; accountsWithProjects
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2015-12-04
    • 2018-10-30
    • 1970-01-01
    相关资源
    最近更新 更多