如何进行两次 Retrofit 调用并合并结果?
How to make two Retrofit calls and combine results?
我一直在浏览 Whosebug 和其他 Android 相关网站,试图了解这一点,但我仍在努力。
我正在使用 Retrofit 调用 API,如下所示:
public interface TheMovieDbApi {
@GET("genre/{type}/list")
Observable<GenresReply<Genre>> getGenreList(@Path("type") String type);
}
上面的例子returns一个包含流派列表的对象(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 调用并从每个 response/the 组合流派列表中提取流派列表?
解决方案
感谢 and 的评论,这是我想出的:
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() {
}
});
}
您应该可以执行以下操作:
Observable.zip(api.getGenreList("movie", api.getGenreList("tv", (movieInfo, tvInfo) -> Pair.create(movieInfo, tvInfo)).subscribe(movieTvPair -> {
})
我一直在浏览 Whosebug 和其他 Android 相关网站,试图了解这一点,但我仍在努力。
我正在使用 Retrofit 调用 API,如下所示:
public interface TheMovieDbApi {
@GET("genre/{type}/list")
Observable<GenresReply<Genre>> getGenreList(@Path("type") String type);
}
上面的例子returns一个包含流派列表的对象(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 调用并从每个 response/the 组合流派列表中提取流派列表?
解决方案
感谢
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() {
}
});
}
您应该可以执行以下操作:
Observable.zip(api.getGenreList("movie", api.getGenreList("tv", (movieInfo, tvInfo) -> Pair.create(movieInfo, tvInfo)).subscribe(movieTvPair -> {
})