如何进行两次Retrofit调用并合并结果?

时间:2017-09-26 13:57:12

标签: android retrofit rx-java themoviedb-api

我一直在寻找StackOverflow和其他与Android相关的网站,试图抓住这一点,但我仍在苦苦挣扎。

我使用Retrofit来调用API,如下所示:

public interface TheMovieDbApi {

@GET("genre/{type}/list")
Observable<GenresReply<Genre>> getGenreList(@Path("type") String type);

}

上面的示例返回一个Object(GenresReply),其中包含一个流派列表。

我需要拨打两次电话 - 一次用于电影,一次用于电视 - 并将结果合并。看了这里的其他例子后,我想出了以下内容:

    private void loadGenres() {
    List<Observable<?>> requests = new ArrayList<>();

    requests.add(api.getGenreList("movie"));
    requests.add(api.getGenreList("tv"));

    //Now what?
}

我在下一步失败了。我已经看过使用Observable.concat(),. aflatMap()和.zip()然后订阅输出的例子,但我对RxJava不太熟悉,不知道接下来要做什么。

TL; DR如何进行两次API调用并从每个响应/类型列表中提取类型列表?

解决方案

感谢Johnmasp的评论,以下是我提出的建议:

    private void loadGenres() {
    Observable.zip(api.getGenreList(MOVIE_GENRES), api.getGenreList(SHOW_GENRES),
            new BiFunction<GenresReply<Genre>, GenresReply<Genre>, List<Genre>>() {
                @Override
                public List<Genre> apply(GenresReply<Genre> movieReply, GenresReply<Genre> showReply)
                        throws Exception {
                    List<Genre> genreList = new ArrayList<>();
                    genreList.addAll(movieReply.getGenres());
                    genreList.addAll(showReply.getGenres());

                    return genreList;
                }
            }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Genre>>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull List<Genre> genres) {
                    DatabaseUtils.insertGenres(genres, ListActivity.this);
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    mSharedPreferences.edit().putBoolean(FIRST_RUN, true).apply();
                }

                @Override
                public void onComplete() {

                }
            });
}

1 个答案:

答案 0 :(得分:0)

您应该可以执行以下操作:

    Observable.zip(api.getGenreList("movie", api.getGenreList("tv", (movieInfo, tvInfo) -> Pair.create(movieInfo, tvInfo)).subscribe(movieTvPair -> {

    })