【问题标题】:How to make two Retrofit calls and combine results?如何进行两次 Retrofit 调用并合并结果?
【发布时间】:2018-03-07 19:07:21
【问题描述】:

我一直在查看 StackOverflow 和其他与 Android 相关的网站,试图掌握这一点,但我仍在苦苦挣扎。

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

public interface TheMovieDbApi {

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

}

上面的示例返回一个包含流派列表的对象 (GenresReply)。

我需要调用两次 - 一次用于电影,一次用于电视 - 并结合结果。在查看了此处的其他示例后,我想出了以下内容:

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

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

    //Now what?
}

我迷失了下一步。我见过使用 Observable.concat()、.flatMap() 和 .zip() 的示例,然后订阅输出,但我对 RxJava 不够熟悉,不知道下一步该做什么。

TL;DR 我如何进行两次 API 调用并从每个响应/组合的流派列表中提取流派列表?

解决方案

感谢Johnmasp 的cmets,这是我想出的:

    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() {

                }
            });
}

【问题讨论】:

  • 我认为您可以查看this 问题以了解您的案例的一个很好的例子。
  • 如果您不想使用 RxJava,您可以在第一个调用的返回中进行第二次调用。但是它不是那么好,可能会变得非常混乱。

标签: android retrofit rx-java themoviedb-api


【解决方案1】:

您应该能够执行以下操作:

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

    })

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2021-09-03
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2022-06-10
    相关资源
    最近更新 更多