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
}
});
只需确保为您的用例使用正确的调度程序。
(小心,因为这个订阅调用不处理错误,但我想你可以很容易地解决这个问题)
所以,假设我需要为 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
}
});
只需确保为您的用例使用正确的调度程序。
(小心,因为这个订阅调用不处理错误,但我想你可以很容易地解决这个问题)