2016-11-04 4 views
2

Мне нужно конкатенировать несколько вызовов API, и я хотел бы использовать для этого функции retrofit2 и rxJava. Мой сценарий выглядит следующим образом:Конкатентные множественные вызовы с дооснащением 2 и rxJava

я должен сделать первый звонок, который будет возвращать массив объектов, то ответ будет что-то вроде:

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

Тогда мне нужно сделать вызов API по каждому объекту, поэтому ответ API для каждого объекта будет что-то вроде:

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

так что я хочу Concat всех этих вызовов и объединить его в уникальном объекте ответа, который будет иметь всю информацию. Как я мог это сделать? Как я могу выполнить первый вызов, а затем ответить на вызов на объект и дождаться завершения всех вызовов и слияния результатов?

Большое спасибо

+2

использование почтового индекса или combileLast из RxJava – Blackbelt

+0

Спасибо очень много, но как я могу это сделать? Я имею в виду, как я могу получить результат первого наблюдаемого, а затем создать остальные наблюдаемые и объединить его результаты? Я думаю, что 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(); 

Идея заключается в следующем:

  1. Fetch всех шоу (getShows)
  2. Получить поток отдельных шоу из списка (Observable.from() оператора)
  3. Получить глава для каждого шоу (getTvChapters(tvShow.id))
  4. комбината Результаты tvChapters позвонить по телефону tvShow
  5. Слияние всех результатов (Observable.toList())
+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 Что вы имеете в виду: async scheduler. Я действительно запутался в этом, и я получаю это исключение! –

+0

Привет, я обновил свой ответ –

+0

Я действительно борюсь с этой проблемой. У меня уже есть некоторые ребята, которые помогают мне, но ни один из ответов не работал. Можете ли вы проверить поток? Я буду очень благодарен! (Я не знаю, могу ли я это сделать, но я не знаю другого способа вызвать вас там) http://stackoverflow.com/questions/44007570/rxjava-2-retrofit-2-networkonmainthreadexception/44010393#44010393 –

Смежные вопросы