2015-10-19 126 views
1

我正在嘗試在android應用程序中實現rxJava,並且我試圖圍繞這個來包裝我的頭。這裏是我試圖滿足的情況:按順序執行Observable

  1. 調用Web服務來獲取程序的詳細信息
  2. 呼叫與從第一個數據的下一個Web服務,以確定它的流媒體直播狀態(無,轉碼,完整等)
  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函數將第一個observable的結果作爲輸入,您可以將該結果傳遞給第二個observable getter,然後傳播到該observable的結果。 – FriendlyMikhail