2016-11-04 3 views
2

複数のAPI呼び出しを連結する必要があり、retrofit2とrxJavaのオブザーバブルを使用したいと思います。次のように私のシナリオは次のとおりです。Retrofit 2とrxJavaで複数の呼び出しをconcat

私はオブジェクトの配列を返します。最初の呼び出しを行う必要があり、応答のようなものになります。その後、私は、各オブジェクトごとにAPI呼び出しを行う必要があり

[{"title": "Title 1", "id": "1"}, {"title": "Title 2", "id": "2"}] 

、だから私はすべてのこれらの呼び出しをCONCAT、すべての情報を持っているでしょう独自のレスポンスオブジェクトでそれをマージしたい

[{"title": "Chapter A", "id": "1A", ...}, {"title": "Chapter B", "id": "1B", ...}, ...] 

:そう、各オブジェクトのAPIレスポンスは次のようになります。どうすればいい?どのようにして最初の呼び出しを行い、応答でオブジェクトごとに呼び出しを行い、すべての呼び出しが完了して結果がマージされるまで待つことができますか?

public class TvShow { 
    public String title; 
    public Long id; 
    public List<TvChapter> chapterList; 
} 

public class TvChapter { 
    public String title; 
    public String id; 
} 

そして、あなたはすでにデータを取得するためのメソッドがあります:ここで

public Observable<List<TvShow>> getShows() 

public Observable<List<TvChapter>> getTvChapters(Long tvShowId) 

を組み合わせRxJavaストリームが戻っていることである

どうもありがとう

+2

利用zipやcombileLast RxJava – Blackbelt

+0

からはどうもありがとうございましたが、私はそれをどのように行うことができますか?つまり、最初の観測結果をどのように受け取ってから、他の観測対象を作成してその結果を組み合わせることができますか?私はobservablesのリストを取得したらcom zipが使用されると思いますが、どのようにして最初の呼び出しを実行し、応答を解析してobservablesのリストを作成できますか? – FVod

答えて

5

は、あなたが定義されたプロパティを持つオブジェクトがあるとしObservable<List<TvShow>>

getShows() 
     .flatMap(new Func1<List<TvShow>, Observable<TvShow>>() { 
      @Override 
      public Observable<TvShow> call(List<TvShow> tvShows) { 
       return Observable.from(tvShows); 
      } 
     }).flatMap(new Func1<TvShow, Observable<TvShow>>() { 
    @Override 
    public Observable<TvShow> call(TvShow tvShow) { 
     return Observable.zip(Observable.just(tvShow), 
       getTvChapters(tvShow.id), 
       new Func2<TvShow, List<TvChapter>, TvShow>() { 
        @Override 
        public TvShow call(TvShow tvShow, List<TvChapter> tvChapters) { 
         tvShow.chapterList = tvChapters; 
         return tvShow; 
        } 
       }); 
    } 
}).toList(); 

アイデアがにされています

  1. 全番組(getShows
  2. を取得
  3. Observable.from()オペレータ)リストから一つの番組のストリームを取得組み合わせる
  4. getTvChapters(tvShow.id))各ショーのための章を取得tvChaptersの結果tvShow
  5. すべての結果をマージする
+0

非常にありがとう、それは魅力のように働いています – FVod

1

使用してラムダ

getTitlesList() //first API call that returns Observable<Titles> 
     .flatmap(titles -> Observable.from(titles)) //forcing list to emit each element separately 
     .flatmap(title -> getDetail(title)) //second API call that returns Observable<Detail> 
     .toList() //collect all emitted items to list 
     .subscribeOn(Schedulers.io()) // don't forget to apply async scheduler, 
            // otherwise you'll get *android.os.NetworkOnMainThreadException* 
     .observeOn(AndroidSchedulers.mainThread()) //and switch thread back to main, if needed 
     .subscribe(details -> { 
      //process your details list 
     }, e -> { 
      //error handling 
     }); 
+0

ちょっと@MaximOstrovidov何を意味するのですか:非同期スケジューラ。私はそれについて本当に混乱しています、私はこの例外を得ています! –

+0

こんにちは、私は私の答えを更新しました –

+0

私は本当にこの問題に苦しんでいます。私はすでにいくつかの人を助けてくれていますが、答えのどれも働いていません。スレッドを確認してください。私は本当に素晴らしいよ! (私はこれを行うことができるかどうかはわかりませんが、私はそこにあなたを召喚する他の方法を知らない)http://stackoverflow.com/questions/44007570/rxjava-2-retrofit-2-networkonmainthreadexception/44010393#44010393 –

関連する問題