Android 如何使用 Rxjava 结合多个 http 请求和数据库查询
How to combine multiple http requests and database query with Rxjava on Android
我需要执行多个 http 请求和一个数据库查询才能过滤数据。
我正在使用 Rxjava 的 zip 运算符
我做了以下准备我的多个 HTTP 请求
List<Observable<List<Picture>>> requests = new ArrayList<>();
for(String id : photoIds) {
requests.add(pictureRepository.searchPicture(id).toObservable());
}
我做了以下准备我的数据库请求
Observable<List<Favourite>> favourites = pictureRepository.getFavourites().toObservable();
我尝试创建可观察对象,但 rxjava 不接受我的代码
Observable.zip(
requests, favourites,
new BiFunction<Object[], List<Favourite>, List<FavouritePictures>>() {
@Override
public List<FavouritePictures> apply(Object[] t1, List<Favourite> t2) throws Exception {
return /*here I want to check the favourites and return a list*/;
}
}
);
有办法实现吗?
谢谢
可能适用于此的解决方案如下:
val photoIds = listOf(1, 2, 3)
var index = 0
Observable.just(0).flatMapSingle {
pictureRepository.searchPicture(photoIds[index])
index += 1
}.repeatUntil {
index + 1 == photoIds.size - 1
}.toList().zipWith(pictureRepository.getFavourites(),
BiFunction { listOfPictures, listOfFavoratePictures ->
// Return your list
})
- 此可观察流将从发出 0 开始;
- 然后它将流平面映射到单个 Observable 和 return 来自 searchPicture 调用的可观察流;
- 此过程将一直持续到达到最后一个项目索引为止;
- 然后我们将要发出的结果映射为一个列表;
- 最后我们使用 getFavourites 调用压缩单个 Observable;
您也可以使用递归方法实现此目的,但我个人认为这更具可读性。
我需要执行多个 http 请求和一个数据库查询才能过滤数据。
我正在使用 Rxjava 的 zip 运算符
我做了以下准备我的多个 HTTP 请求
List<Observable<List<Picture>>> requests = new ArrayList<>();
for(String id : photoIds) {
requests.add(pictureRepository.searchPicture(id).toObservable());
}
我做了以下准备我的数据库请求
Observable<List<Favourite>> favourites = pictureRepository.getFavourites().toObservable();
我尝试创建可观察对象,但 rxjava 不接受我的代码
Observable.zip(
requests, favourites,
new BiFunction<Object[], List<Favourite>, List<FavouritePictures>>() {
@Override
public List<FavouritePictures> apply(Object[] t1, List<Favourite> t2) throws Exception {
return /*here I want to check the favourites and return a list*/;
}
}
);
有办法实现吗? 谢谢
可能适用于此的解决方案如下:
val photoIds = listOf(1, 2, 3)
var index = 0
Observable.just(0).flatMapSingle {
pictureRepository.searchPicture(photoIds[index])
index += 1
}.repeatUntil {
index + 1 == photoIds.size - 1
}.toList().zipWith(pictureRepository.getFavourites(),
BiFunction { listOfPictures, listOfFavoratePictures ->
// Return your list
})
- 此可观察流将从发出 0 开始;
- 然后它将流平面映射到单个 Observable 和 return 来自 searchPicture 调用的可观察流;
- 此过程将一直持续到达到最后一个项目索引为止;
- 然后我们将要发出的结果映射为一个列表;
- 最后我们使用 getFavourites 调用压缩单个 Observable;
您也可以使用递归方法实现此目的,但我个人认为这更具可读性。