2016-11-04 6 views
2

여러 API 호출을 연결해야하고 retrofit2 및 rxJava observables를 사용하고 싶습니다. 다음과 같이 내 시나리오는 다음과 같습니다,Retrofit 2 및 rxJava를 사용하여 여러 번 호출하기

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

은 그럼 각 개체 당 API 호출을 수행해야합니다

내가 객체의 배열을 반환하는 첫 번째 통화를해야 응답은 같은 것을 할 것이다

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

그래서 나는 모든 통화를 CONCAT 모든 정보를 것 고유 응답 객체를 병합 할 : 각각의 객체의 API 응답은 같은 것을 할 것이다. 내가 어떻게 할 수 있니? 첫 번째 호출을 수행 한 다음 응답을 통해 객체 당 호출을 수행하고 모든 호출이 완료되고 결과를 병합 할 때까지 기다릴 수 있습니까?

감사

+2

사용 zip 또는 combileLast RxJava – Blackbelt

+0

에서 매우 감사합니다,하지만 난 그것을 어떻게 할 수 있을까? 제 첫 번째 관측 결과를 어떻게 받아 들일 수 있고 다른 관측 대상을 만들어 결과를 결합 할 수 있을까요? 나는 observables의 목록을 가지고 있으면 com zip이 사용될 것이라고 추측하지만, 어떻게하면 첫 번째 호출을 수행하고, 관측 가능 목록을 생성하기 위해 응답을 파싱 할 수 있습니까? – FVod

답변

5

사용자가 정의한 속성을 가진 객체가 있다고 가정 많은 :

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 스트림입니다 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(); 
( getTvChapters(tvShow.id))
  • 결합

    1. 모든 쇼 (getShows)
    2. 이 목록에서 하나의 쇼의 스트림을 취득 (Observable.from() 운영자)
    3. 각 쇼를 위해 장을 가져 오기 가져 오기 :

      아이디어에있다 tvChapters의 결과 : tvShow의 전화 번호

    4. 모든 결과 병합
    5. ,210
  • +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 –

    관련 문제