RxJava for循环与异步方法?

nig*_*xed 1 android rx-java

我正在学习如何在Android上使用RxJava.在我的项目中,我有一个单一的情况,我List从服务器获取一个项目,我需要获取每个项目的详细信息,然后将响应返回到UI.

问题是:我不确定如何sync在内部调用API调用for loop.我希望在foor loop完成所有调用之后,最终结果返回到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              
              }
            });
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*yev 7

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

其次,你最好flatMap先回复一个Observable<Favorite>,然后flatMap再次获得详细信息.像这样的东西:

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

您甚至可以通过以下方式进行并行呼叫以获取您的详

    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();
Run Code Online (Sandbox Code Playgroud)