当前位置: 首页 > 知识库问答 >
问题:

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

林正平
2023-03-14

我是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)在完成下一个(TempoAccount TempoAccount)中的所有观察之前被激发。

编辑:

我想创建这样一个类型的可观察对象:<代码>可观察

>

  • 可观察

    <代码>可观察

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


  • 共有1个答案

    郭永怡
    2023-03-14

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

     类似资料:
    • 有没有一种方法可以让发出数据,并且当它发出数据时(或者当它完成时)以异步方式使用该数据触发? 我的问题与此非常相似,但我试图异步调用Completable。 这是我试图实现的一个微不足道的例子: 我看到订阅映射中的Completable允许我以某种方式完成这项任务,但我不知道如何以正确的方式处理它(因为在活动中不调用此方法)。 非常感谢您的帮助,谢谢!

    • 我对RxJava并不完全陌生,但我被一项看似简单的任务所阻碍。 我有一个数据源,它公开了一个反应式API,我所要做的就是获取一些数据,返回它,并在没有其他消息发出时自动关闭连接。 这是我的代码: conn.query()和conn.close()在不同的调度程序中异步执行。此代码不起作用,因为conn.close()返回一个没有订阅服务器的Completable。此外,如果我手动订阅doOnCom

    • 问题内容: 我想在pullData()完成后运行loadViews(),但我想知道这样做的最佳方法是什么?我也想在其上设置10秒超时,以便在可能的情况下显示网络错误。根据我的阅读,GCD看起来是完成此任务的方法,但是我对它的实现感到困惑。谢谢你提供的所有帮助! 问题答案: 您需要的是带有完成块的完成处理程序。 创建它非常简单: 并使用您的完成块,如下所示:

    • 我需要在页面加载时加载一些数据,然后执行一个任务。为了获得我想要的数据,我执行了多个不同的ajax调用。但是为了执行任务,我需要确保所有的ajax调用都已经完成。这是我到目前为止所做的: 我的问题是块在所有ajax调用完成后没有执行。我在我的控制台中得到了这样的东西: 我一定是做错了什么。我怎样才能让它按照我想要的方式工作? 编辑:我尝试了下面的方法,就像答案中提到的那样,但是我仍然面临同样的问题

    • 我使用JavaFX中的时间线对进行倒计时: 我想在时间线结束后返回一个值: 下面是一个最小的、完整的、可验证的示例: 您可以看到它首先显示“countdown Finished”并向下倒数到0,而不是从倒计时开始并向下倒数到“countdown Finished”。

    • 问题内容: 我有多个ajax查询同时运行,我希望它们等待最后一个返回,然后在所有ajax调用上运行成功处理程序。作为简化示例,请考虑: 假设所有请求都同时发送。由于它们是异步的,因此它们将在不同的时间返回。假设一个请求返回需要100毫秒,而另一个请求则需要3000毫秒。我显然不知道哪个会最先返回。他们都以某种方式更新了DOM,我希望一次将这些更改一次全部显示给查看器。我该怎么做呢? 我能想到的最好