2016-12-03 8 views
1

AndroidでRxJavaを使用する方法を学んでいます。私のプロジェクトでは、サーバーからアイテムのListを取得するという単一の状況があり、UIに応答を返す前に各アイテムの詳細を取得する必要があります。RxJava for-loop for async methoods?

問題は次のとおりです。syncfor loopの内部で呼び出されるAPI呼び出しの仕組みがわかりません。 foor loopのすべての呼び出しが完了した後にのみ、UIに最終結果を返します。

すべてのヒントはです。です。

サンプルコード:あなたはObservableに加入されていないため、すべての

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が呼び出されません。

第2に、あなたの最初の応答を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

私は2番目のスニペットで示されたアプローチを取り、提案をいただき、ありがとうございます。 – nightfixed

関連する問題