gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:49:15 24 4
gpt4 key购买 nike

我一直在浏览 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 调用并从每个响应/组合的流派列表中提取流派列表?

解决方案

感谢 John 的评论和 masp ,这是我想出的:

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

})

关于android - 如何进行两次 Retrofit 调用并合并结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46428477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com