2015-10-19 4 views
1

Я пытаюсь реализовать rxJava в приложении android, и я пытаюсь обернуть голову вокруг этого. Вот сценарий я пытаюсь удовлетворить:Выполнение наблюдаемых в последовательности

  1. вызов веб-службы, чтобы получить информацию о программе
  2. вызов на следующий веб-службы с данными первого для определения его текущего состояния потокового (нет, перекодирование, полная , и т. д.)
  3. объединить и преобразовать ответ в объект, который отправляется обратно вверх на ui для отображения.

В идеале, если вызов на шаге 2 содержит ответ, и он не завершен, это может продолжаться до тех пор, пока это задание не завершится на бэкэнд. Но я делаю здесь детские шаги и буду заниматься этим следующим.

ОБНОВЛЕНИЕ: 2015-10-21 Здесь я до сих пор. Возможно, я смогу очиститься.

public Observable<Program> recordedProgram(int chanId, DateTime startTime) { 

    final DvrDataStore dvrDataStore = this.dvrDataStoreFactory.create(chanId, startTime); 
    final ContentDataStore contentDataStore = this.contentDataStoreFactory.createMasterBackendDataStore(); 

    Observable<ProgramEntity> programEntity = dvrDataStore.recordedProgramEntityDetails(chanId, startTime); 
    Observable<List<LiveStreamInfoEntity>> liveStreamInfoEntity = programEntity 
     .flatMap(recordedProgramEntity -> contentDataStore.liveStreamInfoEntityList(recordedProgramEntity.getFileName())); 

    Observable<ProgramEntity> recordedProgramEntity = Observable.zip(programEntity, liveStreamInfoEntity, new Func2<ProgramEntity, List<LiveStreamInfoEntity>, ProgramEntity>() { 

     @Override 
     public ProgramEntity call(ProgramEntity programEntity, List<LiveStreamInfoEntity> liveStreamInfoEntityList) { 

      if (null != liveStreamInfoEntityList && !liveStreamInfoEntityList.isEmpty()) { 
       programEntity.setLiveStreamInfoEntity(liveStreamInfoEntityList.get(0)); 
      } 

      return programEntity; 
     } 

    }); 

    return recordedProgramEntity.map(recordedProgram -> 

    this.programEntityDataMapper.transform(recordedProgram)); 
} 

ответ

0
  1. .firstObservable.flatmap(...) //will have access to first result
  2. .filter(...) //will filter out the ones that dont fit your condition)
  3. .map(...) //will have access to second result)
  4. .subscribe()
+0

не знаю, почему форматирование было Editted. Это была целая цепочка кода, а не ряд серьезных шагов. – FriendlyMikhail

+0

Спасибо @MikeN похоже, что это может сработать. Один вопрос, secondObservable испускает другой тип, мне действительно нужно, чтобы он добавлялся к атрибуту firstObservable. Это возможно? – dmfrey

+0

функции flatmap получают в качестве входных данных результат первого наблюдаемого, вы можете передать этот результат второму наблюдаемому геттеру, а затем распространить его на результат наблюдаемого. – FriendlyMikhail

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