RxAndroid + Retrofit 2,获取图书列表

RxAndroid + Retrofit 2, getting a list of books

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

我有 ID 列表,但我一次只能得到一本书,所以,我真的没有 bookAPI.getFavoriteBooks(listOfFavoriteIds) 方法调用(服务器没有那个端点) ),但我必须为列表中的每个 id 调用 bookAPI.getBook(id) 以获取所有最喜欢的书,并且在我获取它们之后我应该 return 一个包含结果的列表。

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

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

很难从你的问题中判断这是否符合你的需要,但你可以试试:

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

让我解释一下这里发生了什么。 fromIterable 创建一个可观察对象,将可迭代对象中的每个元素作为事件发出。在这种情况下,它将发出每本书的 ID。

然后您将平面地图表示可观察到您的 api 可观察。因此,在这种情况下,您将每个发射的 Id 映射到一个 Observable,该 Observable 从 api.

发射每本书

最后,您将所有已发行的书籍收集为一个列表。一旦你订阅了这个流,它就会有一个列表作为一个事件:

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

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

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