2017-09-26 15 views
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のリストを抽出するのですか? 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() { 

       } 
      }); 
} 
+0

私は[this](https://stackoverflow.com/questions/30219877/rxjava-android-how-to-use-the-zip-operator)の質問を確認できますあなたの事例の非常に良い例。 – masp

+0

RxJavaを使用したくない場合は、最初の呼び出しを返して2番目の呼び出しを行うことができます。しかしそれほど偉大ではないし、非常に乱雑になることがあります。 – Eselfar

答えて

0

あなたが好きな何かを行うことができるはず:

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

    }) 
関連する問題