0
私はStackOverflowやその他のAndroid関連のサイトを調べてこれを把握してきましたが、まだ苦労しています。私は次のようにAPIへの呼び出しを行うためにレトロフィットを使用してい2つのRetrofitコールを作成し、結果を結合するにはどうすればいいですか?
:
public interface TheMovieDbApi {
@GET("genre/{type}/list")
Observable<GenresReply<Genre>> getGenreList(@Path("type") String type);
}
上記の例では、オブジェクトジャンルのリストが含まれています(GenresReply)を返します。
私はこの呼び出しを、映画のために1回、テレビのために1回、行い、結果を組み合わせる必要があります。ここで他の例を見てみましょう。
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どのようにして2つのAPIコールを作成し、各レスポンスからGenresのリスト/複数のGenresのリストを抽出するのですか? 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() {
}
});
}
私は[this](https://stackoverflow.com/questions/30219877/rxjava-android-how-to-use-the-zip-operator)の質問を確認できますあなたの事例の非常に良い例。 – masp
RxJavaを使用したくない場合は、最初の呼び出しを返して2番目の呼び出しを行うことができます。しかしそれほど偉大ではないし、非常に乱雑になることがあります。 – Eselfar