2016-12-03 157 views
1

我正在學習在Android上使用RxJava。在我的項目中,我遇到了一種情況,從服務器獲取List個項目,並且我需要獲取每個項目的詳細信息,然後纔將響應返回給UI。RxJava for循環與異步方法?

問題是:我不知道如何syncfor loop內調用的API調用。我只想在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    
       } 
      }); 
} 

回答

2

首先,在你的getDetailsForFavoriteItem() API不叫,因爲你沒有預訂至Observable

其次,最好是flatMap將你的第一個迴應放入一個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(); 
+0

謝謝你的建議,我把第二片段指示的方法。 – nightfixed