2015-09-24 55 views
3

随着RxJava(没有Retrolambda),我想做一些API调用并使用它完成我的数据。我的不完整对象是一个包含对象“季节”列表的“TvShow”。这个'季节'是空的,我需要完成与情节。RxJava和Retrofit - 与Rx的第一步

Observable<TvShow> getDataTVShow(long idTvShow) 
//get TvShow with empty seasons (except season number) 

Observable<Season> getDataSeason(long idTvShow, int seasonNumber); 
//get one complete season with episodes 

所以我想:

  • 从我的 'TvShow' 对象找我 'TvShow' 对象(OK)
  • 遍历季节(名单< \季>),并做每个赛季都有一次API调用让我的赛季完全完成,并在列表中更新我的'老'赛季。
  • 然后,一旦我们有我们所需要的,持久化数据到数据库(用户部分)

到现在为止,我只有:

Observable<TvShow> = apiService.getDataTvShow(idTvShow) 

我现在需要遍历赛季,我试过使用操作符'映射'从'TvShow'对象切换到我的季节列表(tvShow.getSeasons()),但我不确定是否有好的方法。除此之外,我知道'doOnNext'将用于更新我的'老'赛季,就是这样。

我试着用这个很好的例子的工作:Handling lists with RxJava and Retrofit in android但我仍然停留:(

如果你能帮助我解决这个问题,这将是巨大的:)

回答

3

例如,你有两个观测:

Observable<Season> getSeason(int id) 
Observable<TvShow> getTvShow(String id) 

如何负载TvShow然后加载每个赛季,并填写TvShow:

Observable<TvShow> getFilledTvShow = getTvShow("123") 
     .flatMap(tvShow -> 
       //make stream observable from seasons 
       Observable.from(tvShow.seasons) 
        //load each season from network 
        .flatMap(season -> getSeason(season.id)) 
         //then collect all results to ArrayList 
        .collect(() -> new ArrayList<Season>(), 
         (seasons, filledSeason) -> seasons.add(filledSeason)) 
         //finally fill tvShow and return it 
        .map(filledSeasons_ -> { 
        tvShow.seasons = filledSeasons_; 
        return tvShow; 
        }) 
    ); 
+0

谢谢zella,它的工作!我不知道我们可以处理我们返回的内容(返回Observable.from ...),然后以可观察的回来。顺便说一下,我现在明白为什么使用lambda,与我的样板代码有很大的区别! –

+0

欢迎来到功能世界:) – zella

+2

您可能想使用'.toList()'而不是'collect'方法 – dwursteisen

相关问题