【问题标题】:RxJava - fetch every item on the list and emits one-by-one (any order)RxJava - 获取列表中的每一项并逐一发出(任何顺序)
【发布时间】:2018-11-21 04:52:24
【问题描述】:

我有一个返回Observable<List<Long>> 的方法,它是一些项目的ID。我想浏览此列表并使用另一种返回Observable<Item> 的方法下载每个项目。目前我正在通过以下代码进行操作。

    @Override
    public Observable<List<Item>> getResponses(List<Long> requests) {
        return Observable.from(requests).
                flatMap((Func1<Long, Observable<Item>>) restRequest -> getResponseEach(restRequest)).toList();
    }

它工作正常,但它会在运行时返回所有响应,我的意思是当所有下载完成后,我的 onNext() 就会被调用,

主要问题但或者,一旦从服务器成功获取每个项目,我需要逐个发出每个响应(任何订单),所以我的 onNext 应该每次都单独调用每个项目。

我将如何使用 RxJava 运算符做到这一点?

【问题讨论】:

    标签: android rx-java rx-java2 rx-android


    【解决方案1】:

    您必须删除 toList() 运算符。 toList() 只会在上游的所有排放完成后才会发射,它会收集结果并作为Single&lt;List&lt;YourResultObject&gt;&gt; 发射

    你可以在你的代码中返回flatMap返回的observable,你会一一得到结果,

    public Observable<Item> getResponses(List<Long> requests) {
        return Observable.fromIterable(requests)
                .flatMap(restRequest -> getResponseEach(restRequest));
     }
    

    现在,您的 getResponses 方法将返回 Observable&lt;Item&gt; 而不是 Observable&lt;List&lt;Item&gt;&gt;

    您可以按如下方式订阅此功能

        getResponses(ids)
               .subscribe(new DisposableObserver<Item>() {
                   @Override
                   public void onNext(Item item) {
                       // each item will be received here one by one
                   }
    
                   @Override
                   public void onError(Throwable e) {
                       // handle any occured error during the operation
                   }
    
                   @Override
                   public void onComplete() {
                       // all operations completed
                   } 
               });
    

    【讨论】:

    • 你的getResponseEach 返回Observable&lt;Item&gt; 对吗?
    • 是的,但我使用的不是Observable.fromIterable,而是Observable.from(),只是bcoz fromIterable可用。
    • 你使用的是 Rxjava 1 或 2
    • 我正在使用 RxJava 1
    • 好的,然后使用from 代替fromIterablefromIterable 在 Rxjava 2 中引入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多