2017-02-16 52 views
1

結果我有2個改造調用多個呼叫我需要做一個& B:RxJava flatmap:如何使基於從第一個電話

(A):返回一個ArrayList

(B):獲取(A)的結果是一個ArrayList。 (B)遍歷ArrayList並使用每個ArrayList進行翻新調用,並將生成的數據組合到最終ArrayList中,該ArrayList發送給我的訂閱者onNext()

我無法獲取正確的語法.... for例如我試圖返回arAllMedia,但是我下面的代碼期望我返回一個Observable。

ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken()) 
       .flatMap(new Func1<UserSelfFollows, Observable<? extends ArrayList<Media.MediaData>>>() { 
        @Override 
        public Observable<? extends ArrayList<Media.MediaData>> call(UserSelfFollows userSelfFollows) { 

         //make second requests based on response from First request to get all Users 
         ArrayList<Media.MediaData> arAllMedia = new ArrayList<>(); 
         for(UserSelfFollows.UserDataFollows user : userSelfFollows.userdata){ 

          Response <ResponseBody> response ; 
          Call <ResponseBody> call; 
          try { 
           call = ServiceFactory.createRetrofitService().getMediaOfUser(user.id,sessionMgr.getAuthToken()); 
           response = call.execute(); 
          }catch(IOException ex){ 
           return Observable.error(ex); 
          } 

          if (response.isSuccessful()) { 

           try { 
            String str = responseHelper.streamToString(response.body().byteStream()); 
            Gson gson = new GsonBuilder().create(); 
            Media media = gson.fromJson(str, Media.class); 

            arAllMedia.addAll(media.mediaData); 

           } catch (IOException e) { 
            return Observable.error(e); 
           } 
          } else { 
           return Observable.error(new Exception( responseHelper.getErrorString(response.errorBody().byteStream()))); 
          } 
         } 
         return Observable.just(arAllMedia); 

        } 
       }) 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<ArrayList<Media.MediaData>>() { 
        @Override 
        public final void onCompleted() { 

        } 

        @Override 
        public final void onError(Throwable e) { 

        } 

        @Override 
        public final void onNext(ArrayList<Media.MediaData> arMedia) { 

        } 
       }) 

採用Maxim建議下面我有以下,但它不會編譯:

ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken()) 
       .flatMapIterable(new Func1<UserSelfFollows, Iterable<?>>() { 
        @Override 
        public Iterable<?> call(UserSelfFollows userSelfFollows) { 
         return userSelfFollows.userdata; 
        } 
       }) 
       .concatMap(new Func1<UserSelfFollows.UserDataFollows, Observable<Media.MediaData>>() { 
        @Override 
        public Observable<Media.MediaData> call(UserSelfFollows.UserDataFollows user) { 

         return ServiceFactory.createRetrofitService().getMediaOfUser(user.id,sessionMgr.getAuthToken()); 
        } 
       }); 

回答

1

你需要返回

Observable.just(arAllMedia) 
0

你可以扁平化您的List使用flatMapIterable,然後火使用concatMap順序請求,然後使用toList將結果收回到List運算符:

ServiceFactory.createRetrofitService().getUserFollowing(sessionMgr.getAuthToken() 
    .flatMapIterable(userSelfFollows -> userSelfFollows.userdata) 
    .concatMap(user -> /*get & parse media; must return Observable<Media.MediaData>*/) 
    .toList() 
    ... 
+0

我確實得到它的工作,我編輯了上面的答案,以顯示我正在實現什麼,但似乎我的循環可能會更優雅地完成。您可以使用我的代碼在上面應用您的建議嗎? – Mike6679

+0

我已更新我的答案,其餘實施由您決定 –

+0

謝謝,但我不能應用您的建議,並且實際上沒有關於如何操作的示例。 – Mike6679