定期调用一个observable并仅在下一个成功时切换到下一个

时间:2018-04-09 09:28:56

标签: android retrofit rx-java reactivex

我需要每秒轮询端点,目前我用

进行
Observable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
    .switchMap { return pollWithRetrofit() }

除了处理开始时间超过1秒的情况之外,它工作正常,因此在我得到任何响应之前,swithMap取消了改装订阅。它可以连续多次发生,有效地使客户端长时间没有来自轮询呼叫的任何响应。在这种情况下,我希望在下次通话收到回复之前不要取消改装电话。

我知道switchMap在基本订阅产生onNext电话时取消之前的订阅,目前它每隔一秒由Observable.interval发生,所以我的想法是取消之前的电话改造称之为onNext,即将转换向前移动一步反应链。

我该怎么做?还是有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

您可以使用onBackpressureDropflatMap,maxConcurrency为1,以确保仍然允许更长的通话成功:

Flowable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
.onBackpressureDrop()
.flatMap(v -> pollWithRetrofit(), 1);

答案 1 :(得分:2)

fwiw我使用类似下面的代码来做类似的事情......我并不完全相信这是最干净的方法(虽然现在已成功运作了一段时间)

someRetrofitInterface.apiCall()
                .repeatWhen { completed -> completed.delay(30, TimeUnit.SECONDS) }
                .retry(3)

(来自https://github.com/joreilly/galway-bus-android/blob/master/base/src/main/java/com/surrus/galwaybus/domain/interactor/GetNearestBusStopsUseCase.kt