2015-09-24 6 views
3

С RxJava (без Retrolambda), я хотел бы сделать некоторые вызовы API и заполнить мои данные с ним. Мой неполный объект - это «TvShow» со списком объектов «Сезон». Этот «сезон» пуст, и мне нужно закончить его эпизодами.RxJava and Retrofit - первые шаги с Rx

Observable<TvShow> getDataTVShow(long idTvShow) 
//get TvShow with empty seasons (except season number) 

Observable<Season> getDataSeason(long idTvShow, int seasonNumber); 
//get one complete season with episodes 

Так что я хочу:

  • Получить мой 'TvShow' объект (OK)
  • перебрать сезонов (Список < \ Сезон>) от моего объекта 'TvShow' и сделать для каждого сезона призыв API, чтобы мой сезон был полностью завершен и обновил мой «старый» сезон в списке.
  • Тогда, как только у нас все, что нужно, сохранять данные в базу данных (абонентская часть)

До сих пор я только нет:

Observable<TvShow> = apiService.getDataTvShow(idTvShow) 

мне сейчас нужно перебрать сезонов, я пытался использовать оператор 'map' для переключения с объекта 'TvShow' на мой список сезонов (tvShow.getSeasons()), но я не уверен, что буду в хорошем смысле. Кроме того, я знаю, что «doOnNext» будет использоваться для обновления моего «старого» сезона, вот и все.

Я пытался работать с этим хорошим примером: Handling lists with RxJava and Retrofit in android, но я до сих пор застрял :(

Если вы можете помочь мне решить эту проблему, было бы здорово :)

ответ

3

Например у вас есть два наблюдаемые:

Observable<Season> getSeason(int id) 
Observable<TvShow> getTvShow(String id) 

Как TvShow нагрузки затем загрузить каждый сезон и заполнить TvShow:

Observable<TvShow> getFilledTvShow = getTvShow("123") 
     .flatMap(tvShow -> 
       //make stream observable from seasons 
       Observable.from(tvShow.seasons) 
        //load each season from network 
        .flatMap(season -> getSeason(season.id)) 
         //then collect all results to ArrayList 
        .collect(() -> new ArrayList<Season>(), 
         (seasons, filledSeason) -> seasons.add(filledSeason)) 
         //finally fill tvShow and return it 
        .map(filledSeasons_ -> { 
        tvShow.seasons = filledSeasons_; 
        return tvShow; 
        }) 
    ); 
+0

Большое спасибо zella, он работает !! Я не знал, что мы можем работать над тем, что мы возвращаем (возвращаем Observable.from ...), а затем возвращаемся в конце с Observable . Кстати, теперь я понимаю, почему используются лямбды, огромная разница с моим шаблоном! –

+0

Добро пожаловать в функциональный мир:) – zella

+2

Вы можете использовать '.toList()' вместо метода 'collect' – dwursteisen

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