RxAndroid + Retrofit 2,获取图书清单

时间:2017-03-21 18:19:43

标签: retrofit2 rx-android

所以,假设我需要获取一个Android应用程序最喜欢的书籍列表。

我有id列表,但我一次只能得到一本书,所以,我实际上没有bookAPI.getFavoriteBooks(listOfFavoriteIds)方法调用(服务器没有端点),但是我必须为列表中的每个bookAPI.getBook(id)拨打id以获取所有喜欢的书籍,在我得到它们之后,我应该返回一个包含结果的列表。

到目前为止我找到的答案假设有一种方法Observable<List<Book>> getFavoriteBooks(List<Integer> ids)我可以打电话,但在这种情况下我没有。

有没有办法使用RxAndroid和Retrofit 2解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果这符合您的需求,很难从您的问题中说出来,但您可以尝试:

Observable.fromIterable(listOfIds)
            .flatMap(new Function<Integer, ObservableSource<Book>>() {
                @Override
                public ObservableSource<Book> apply(Integer integer)
                                                     throws Exception {
                    return bookApi.getBook(id);
                }
            })
            .toList()

让我解释一下这里发生了什么。 fromIterable创建一个observable,它将iterable中的每个元素作为事件发出。在这种情况下,它将发出每个图书ID。

然后你将平面地图说明可观察到你的api观察。因此,在这种情况下,您将每个发出的Id映射到一个可从API发出每本书的observable。

最后,您将所有已发放的图书收集为列表。订阅此流后,它将列表作为单个事件:

// whatever way you get the above stream
.subscribe(new Consumer<List<Book>>() {
         @Override
         public void accept(List<Book> result) throws Exception {
            // do whatever you want with result
         }
  });

请确保为您的用例使用正确的调度程序。

(小心,因为这个订阅电话不会处理错误,但我想你可以很容易地解决这个问题)