RxJava-获取列表中的每个项目并发出一对一(任意顺序)

时间:2018-11-21 04:52:25

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

我有一个返回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运算符来做到这一点?

1 个答案:

答案 0 :(得分:1)

您必须删除toList()运算符。 toList()仅在完成上游所有发射后才发射,并且将收集结果并作为Single<List<YourResultObject>>

发射

您可以在代码中返回flatMap返回的observable,然后将得到结果的逐一显示,

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

现在,您的getResponses方法将返回Observable<Item>而不是Observable<List<Item>>

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

    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
               } 
           });