RxJava:为多个observable设置超时?

时间:2016-12-28 15:20:58

标签: java android rx-java rx-android

我有一个场景,我有两个observable,每个都从API调用中返回一个项目。

我想做的是:

  • 同时执行两个api调用。
  • 为两种方法设置超时值(500毫秒)。
  • 在完成后从两者中接收结果,如果两者都超过超时值(500毫秒),我将从两者中收到结果,如果只有一个完成然后我想收到它的结果并收到错误或者第二个空值。
  • 如果两者都没有在超时内完成,我希望收到错误。

我欣赏有关如何实现这一目标的任何提示。

1 个答案:

答案 0 :(得分:4)

假设你的api都返回一个具有类型T排放的Observable,第一步是修改这些observable以便它们超时。 您可以使用ambTimer功能执行此操作。

Observable<T> apiCall1WithTimeout = Observable.amb(apiCall1(), 
                                                   Observable.Timer(500, TimeUnit.MILLISECONDS)
                                                             .flatmap(l -> Observable.error(new Exception("Api1 timed out")));
Observable<T> apiCall2WithTimeout = Observable.amb(apiCall2(), 
                                                   Observable.Timer(500, TimeUnit.MILLISECONDS)
                                                             .flatmap(l -> Observable.error(new Exception("Api2 timed out"))));

第二步是进一步修改你的observable,使他们在不同的线程上工作。这是使用subscribeOn运算符

完成的
Observable<T> apiCall1WithTimeoutNewThread = apiCall1WithTimeout.subscribeOn(Schedulers.newThread());
Observable<T> apiCall2WithTimeoutNewThread = apiCall2WithTimeout.subscribeOn(Schedulers.newThread());

最后一步是合并您的observable的排放,但是您希望最后发出任何超时错误,幸运的是mergeDelayError 运营商就是这么做的

Observable<T> mergedCalls = Observable.mergeDelayError(apiCall1WithTimeoutNewThread, apiCall2WithTimeoutNewThread);