android - 带有异步方法的 RxJava for 循环?

标签 android rx-java

我正在学习在 Android 中使用 RxJava。在我的项目中,有一种情况是我从服务器获取项目的 List,我需要在将响应返回到 UI 之前获取每个项目的详细信息。

问题是:我不确定如何同步 for 循环 中调用的 API 调用。我希望仅在 foor 循环 中的所有调用完成后才将最终结果返回到 UI。

任何提示都非常感谢

示例代码:

Observable<List<Favorite>> result = ApiWrapper.getFavorites(userData)
            .flatMap(new Func1<List<Favorite>, Observable<List<Favorite>>>() {
              @Override
              public Observable<List<Favorite>> call(@NonNull final List<Favorite> response) {
                for(int i = 0; i < response.size(); i++){
                  getDetailsForFavoriteItem(response.get(i));
                }
                return Observable.just(response);              
              }
            });

private Observable<Favorite> getDetailsForFavoriteItem (Favorite item){
  return ApiWrapper.getDetails(item.getId())
        .flatMap(new Func1<FavoriteDetailsResponse, Observable<Favorite>>() {
              @Override
              public Observable<Favorite> call(@NonNull final FavoriteDetailsResponse response) {
                item.setParam1(response.getParam1());
                item.setParam2(response.getParam2);
                //so on
                return Observable.just(item)//!!!issue is here ! I want this return to be called only after all the details (in the for loop) have been called              
              }
            });
}

最佳答案

首先,您的 API 在 getDetailsForFavoriteItem() 中未被调用,因为您没有订阅 Observable .

其次,最好flatMap你的第一 react 变成一个Observable<Favorite>然后 flatMap再次获取它的详细信息。像这样:

    Observable<List<Favorite>> result = ApiWrapper.getFavorites(userData)
            .flatMapIterable(favorites -> favorites)
            .flatMap(favorite -> getDetailsForFavoriteItem(favorite))
            .toList();

您甚至可以通过以下方式进行并行调用以获取您的详细信息:

    Observable<List<Favorite>> result = getFavorites()
            .flatMapIterable(favorites -> favorites)
            .flatMap(favorite -> getDetailsForFavoriteItem(favorite)
                    .subscribeOn(Schedulers.io()), maxConcurrentCalls) // be sure to limit your maxConcurrentCalls or you might get OOM error
            .toList();

关于android - 带有异步方法的 RxJava for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40946153/

相关文章:

android - 反向谷歌图像搜索

java - Flow API 中的 subscription.request(n) 如何在任意 n 值执行背压?

rx-java - 在 RxJava 中公开 "expensive"Observables 的最佳实践

android - 我怎样才能在 android 中使用 vitamio 播放器?

java - 在android中发送蓝牙字符串

java - 从 Facebook SDK android 获取用户电子邮件

java - RxJava 中的超时

Android 结构化查找和替换 XML

android - Schedulers.io() 不返回主线程

java - Android 上 .flatMap() 内的奇怪调度程序行为