我正在学习在 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/