Android RxJava和改装-Rx的第一步

Android RxJava和改装-Rx的第一步,android,retrofit,rx-java,Android,Retrofit,Rx Java,有了RxJava(没有Retrolambda),我想做一些API调用并用它完成我的数据。我的不完整对象是一个带有对象“季节”列表的“电视节目”。这个“季节”是空的,我需要用剧集来完成它 Observable<TvShow> getDataTVShow(long idTvShow) //get TvShow with empty seasons (except season number) Observable<Season> getDataSeason(long idT

有了RxJava(没有Retrolambda),我想做一些API调用并用它完成我的数据。我的不完整对象是一个带有对象“季节”列表的“电视节目”。这个“季节”是空的,我需要用剧集来完成它

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
可观察的getDataTVShow(长idTvShow)
//获取空季的电视节目(季号除外)
可观测的getDataSeason(长idTvShow,整数);
//获得一个完整的剧集季
所以我想:

  • 获取我的“TvShow”对象(确定)
  • 从我的“TvShow”对象迭代季节(列表),并为每个季节执行API调用,以完全完成我的季节并更新列表中的“旧”季节
  • 然后,一旦我们拥有了所需的一切,就将数据持久化到数据库中(订户部分)
到目前为止,我只有:

Observable<TvShow> = apiService.getDataTvShow(idTvShow)
Observable=apiService.getDataTvShow(idTvShow)
我现在需要迭代季节,我尝试使用操作符“map”从“TvShow”对象切换到我的季节列表(TvShow.getSeasons()),但我不确定是否有好的方法。除此之外,我知道“doOnNext”将用于更新我的“旧”赛季,仅此而已

我试着用这个好例子:但我还是被卡住了:(


如果你能帮我解决这个问题,那就太好了:)

例如,你有两个观测值:

Observable<Season> getSeason(int id)
Observable<TvShow> getTvShow(String id)
可观察的getSeason(int id)
可观察的getTvShow(字符串id)
如何加载电视节目,然后加载每个季度并填充电视节目:

  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;
                  })
      );
Observable getFilledTvShow=getvshow(“123”)
.flatMap(电视节目->
//使河流从季节上可见
可观察。来自(电视节目。季节)
//从网络中加载每个季节
.flatMap(季节->获取季节(季节id))
//然后将所有结果收集到ArrayList
.collect(()->new ArrayList(),
(季节,填充季节)->季节。添加(填充季节))
//最后填写电视节目并返回
.map(已填充的季节){
tvShow.seasures=已填充的seasures;
返回电视节目;
})
);

非常感谢塞拉,它起作用了!!我不知道我们可以处理我们返回的内容(返回Observable.from…),然后在最后返回一个Observable。顺便说一句,我现在明白了为什么要使用lambda,这和我的样板代码有很大的不同!欢迎来到函数世界:)您可能希望使用
.toList()
而不是
collect
方法