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

如何在RxJava2中等待可能的项目列表完成?

韩乐湛
2023-03-14

如果我对如何使用RxJava2缺乏基本的了解,请提前道歉,因为在我看来,这应该是非常基本的东西。我已经因为不成功的Google搜索而绞尽脑汁,所以欢迎任何资源推荐。为了清晰起见,我选择使用解决方法代码的“净化”表示。

我有一个RxJava2函数asyncCallForList(),它返回一个也许

每个项目所需的完整数据位于另一个数据库位置,使用另一个函数asyncCallForItem(uid)检索,该函数返回一个

所需的功能是在填充列表中的所有对象后更新我的UI。

在附加到初始doOn成功()中循环遍历生成的数组列表很容易

这得到了期望的结果,但感觉是错误的做法——我怀疑有一种更优雅的RxJava2解决方案。基本上,我创建了一个自定义的可观察的,在其中循环列表中的项目,并获得每个项目的完整数据。但是,我不是每次填充CustomClass项时都更新UI,而是增加计数器,然后检查计数器是否超过或等于初始列表大小。当这个条件满足时,我调用可观察发射器的onComplete()方法,并在那里更新UI。

private void fetchRemoteDataAndUpdateUi() {

    //Counter reset to zero before any asynchronous calls are made.
    int count = 0;

    Maybe<ArrayList<CustomClass>> itemList = asyncCallForList();
    Consumer<ArrayList<CustomClass>> onListReturnedSuccess;

    onListReturnedSuccess = new Consumer<ArrayList<CustomClass >>() {
        @Override
        public void accept(ArrayList<CustomClass> list) throws Exception {
            //Custom observable created here, in which the resulting array list is processed.
            listObservable = Observable.create(new ObservableOnSubscribe<CustomClass>() {
                @Override
                public void subscribe(final ObservableEmitter<CustomClass> e) throws Exception {
                    for (CustomClass customClass : list) {
                        final CustomClass thisCustomClass = customClass;
                        //Call to get full data on list item called here.
                        asyncCallForItem(customClass.getUid())
                                .doOnSuccess(new Consumer<CustomClass>() {
                                    @Override
                                    public void accept(CustomClass customClass) throws Exception {
                                        thisCustomClass.update(customClass);
                                        e.onNext(thisCustomClass);
                                        count++;
                                        if (count >= list.size()) {
                                            e.onComplete();
                                        }
                                    }
                                }).subscribe();
                    }
                }
            });

            listObservable
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(new Observer<CustomClass>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                        }

                        @Override
                        public void onNext(CustomClass customClass) {
                            //Here I add the populated CustomClass object to an ArrayList field that is utilised by the UI.
                            listForUi.add(customClass);
                        }

                        @Override
                        public void onError(Throwable e) {

                        }

                        @Override
                        public void onComplete() {
                            //Here the UI is finally updated once all CustomClass objects have been populated.
                            updateUi();
                        }
                    });
        }
    };


    //Kick everything off.
    itemList.doOnSuccess(onListReturnedSuccess).subscribe();
}

共有1个答案

王辉
2023-03-14

flatMapit!

asyncCallForList()
.subscribeOn(Schedulers.io())
.flatMapSingle(list ->
    Flowable.fromIterable(list)
    .flatMapMaybe(item -> 
        asyncCallForItem(item.id)
        .subscribeOn(Schedulers.io())
        .doOnSuccess(response -> {
            // copy state from the original item
            response.text = item.text;
        })
    , 1) // number of concurrent item calls
    .toList()
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(successList -> { /* update UI */ }, error -> { /* report error */ });

 类似资料:
  • TL;DR:我希望能够等待所有的期货,但是一旦它结束,就得到每个可赎回的返回值。 假设我使用一个执行器运行多个Callable。如果我有一个未来列表,是否有任何优雅的方法可以获得任何已完成任务的回报值,然后以相同的方式等待任务的其余部分?

  • 我有两个完整的。我想做以下场景:如果第一个Completable到达onComplete,继续第二个Completable。最终结果将是完成第二个可完成项。 这就是我在使用单getUserIdAlreadySavedInDevice()和Compltable login()时的做法:

  • 我目前是Jmeter的新手,正在尝试创建一个Jmeter脚本来测试处理和完成请求所需的时间。 a)使用令牌进行身份验证-完成b)发送请求-完成-返回200 c)获取请求-部分完成 C:我正试图得到能够监控这个请求,以找出它什么时候完成,失败等等。 我从研究JSR223采样器开始,但想看看是否有更好更简单的方法来实现这一点。 列表sendGet(字符串url,map 正文){

  • 问题内容: 我的问题: 如何在a上执行一堆线程对象并等待它们全部完成后再继续? 我是ThreadPoolExecutor的新手。因此,此代码是测试以了解其工作方式。现在我什至都不用对象填充,因为我不理解如何在不调用另一个队列的情况下开始队列。无论如何,现在我只是打电话给我,但我认为我仍然缺少一些东西。任何提示都很棒!谢谢。 RunnableObject类: 问题答案: 你应该循环

  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我调用一个方法,该方法为列表中的每个元素返回一次未来 返回的方法是库代码,我无法控制该代码的运行方式,我所拥有的只是。 我想等待所有完成(成功或失败),然后再继续。 有没有比这更好的方法: 对于好奇的人: 与这个等待未来列表的答案不同,我无法控制创建未来的代码。

  • 在我的反应组件中,我将数据从超文本传输协议加载到表中。 当我删除一条记录时,我在后端执行删除,并在响应中再次调用读取表数据。有时删除的行不会从GUI中的表中删除。我认为需要等待,直到删除执行,以便我获取表数据,只有当我知道行被删除。 我的删除功能: