所以,假设我需要获取一个Android应用程序最喜欢的书籍列表。
我有id列表,但我一次只能得到一本书,所以,我实际上没有bookAPI.getFavoriteBooks(listOfFavoriteIds)
方法调用(服务器没有端点),但是我必须为列表中的每个bookAPI.getBook(id)
拨打id
以获取所有喜欢的书籍,在我得到它们之后,我应该返回一个包含结果的列表。
到目前为止我找到的答案假设有一种方法Observable<List<Book>> getFavoriteBooks(List<Integer> ids)
我可以打电话,但在这种情况下我没有。
有没有办法使用RxAndroid和Retrofit 2解决这个问题?
答案 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
}
});
请确保为您的用例使用正确的调度程序。
(小心,因为这个订阅电话不会处理错误,但我想你可以很容易地解决这个问题)