如何在Android上用Rxjava将多个http请求和数据库查询结合在一起?

问题描述 投票:2回答:1

我需要执行多个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*/;
            }
        }
);

有什么方法可以实现吗?谅谅

android rx-java
1个回答
1
投票

以下是一个可能有效的解决方案。

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
         })
  1. 这个可观测流将以发射0开始。
  2. 然后它将把这个流平移到一个Single Observable,并从searchPicture调用中返回观测流。
  3. 这个过程会一直持续下去,直到到达最后一个项目索引。
  4. 然后我们将结果映射成一个列表发出去。
  5. 最后我们用getFavourites调用将Single Observable压缩。

你也可以用递归的方法来实现,但我个人觉得这样更易读。

© www.soinside.com 2019 - 2024. All rights reserved.