使用Retrofit 2和rxJava进行Concat多次调用

FVo*_*Vod 3 android observable rx-java rx-android retrofit2

我需要连接多个API调用,我想使用retrofit2和rxJava observable来做到这一点.我的方案如下:

我必须做第一次调用,返回一个对象数组,响应将是这样的:

[{"title": "Title 1", "id": "1"}, {"title": "Title 2", "id": "2"}]
Run Code Online (Sandbox Code Playgroud)

然后我需要为每个对象执行API调用,因此每个对象的API响应将类似于:

[{"title": "Chapter A", "id": "1A", ...}, {"title": "Chapter B", "id": "1B", ...}, ...]
Run Code Online (Sandbox Code Playgroud)

所以我想连接所有这些调用并将它合并到一个具有所有信息的唯一响应对象中.我怎么能这样做?如何进行第一次调用然后响应对每个对象执行一次调用并等待所有调用完成并合并结果?

非常感谢

R. *_*ski 5

假设您有具有已定义属性的对象:

public class TvShow {
    public String title;
    public Long id;
    public List<TvChapter> chapterList;
}

public class TvChapter {
    public String title;
    public String id;
}
Run Code Online (Sandbox Code Playgroud)

你已经有了获取数据的方法:

public Observable<List<TvShow>> getShows()

public Observable<List<TvChapter>> getTvChapters(Long tvShowId)
Run Code Online (Sandbox Code Playgroud)

以下是返回的组合RxJava流Observable<List<TvShow>>:

getShows()
        .flatMap(new Func1<List<TvShow>, Observable<TvShow>>() {
            @Override
            public Observable<TvShow> call(List<TvShow> tvShows) {
                return Observable.from(tvShows);
            }
        }).flatMap(new Func1<TvShow, Observable<TvShow>>() {
    @Override
    public Observable<TvShow> call(TvShow tvShow) {
        return Observable.zip(Observable.just(tvShow),
                getTvChapters(tvShow.id),
                new Func2<TvShow, List<TvChapter>, TvShow>() {
                    @Override
                    public TvShow call(TvShow tvShow, List<TvChapter> tvChapters) {
                        tvShow.chapterList = tvChapters;
                        return tvShow;
                    }
                });
    }
}).toList();
Run Code Online (Sandbox Code Playgroud)

这个想法是:

  1. 获取所有节目(getShows)
  2. 从列表中获取单个节目流(Observable.from()运营商)
  3. 获取每个节目的章节(getTvChapters(tvShow.id))
  4. 结合tvChapters通话结果tvShow
  5. 合并所有结果(Observable.toList()运算符)