2015-10-19 127 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