2017-02-16 45 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