1
我正在嘗試在android應用程序中實現rxJava,並且我試圖圍繞這個來包裝我的頭。這裏是我試圖滿足的情況:按順序執行Observable
- 調用Web服務來獲取程序的詳細信息
- 呼叫與從第一個數據的下一個Web服務,以確定它的流媒體直播狀態(無,轉碼,完整等)
- 將響應組合並轉換爲一個對象,該對象被髮送回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));
}
不知道爲什麼被格式化editted。這是一個單一的代碼鏈,而不是數量嚴重的步驟。 – FriendlyMikhail
感謝@MikeN它看起來像這可能工作。有一個問題,secondObservable發出不同的類型,我真正需要的是將它添加到firstObservable的屬性中。那可能嗎? – dmfrey
flatmap函數將第一個observable的結果作爲輸入,您可以將該結果傳遞給第二個observable getter,然後傳播到該observable的結果。 – FriendlyMikhail