定期调用一个可观察对象并仅在下一个成功时切换到下一个

Periodically call an observable and switch to next one only when next one succeeds

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

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

它工作正常,除非调用开始花费超过 1 秒的时间来处理,因此在我得到任何响应之前 swithMap 取消了改造订阅。它可以连续发生多次,有效地让客户端在很长一段时间内没有任何来自轮询调用的响应。在这种情况下,我希望在收到下一次呼叫的响应之前不取消改装呼叫。

我知道当基本订阅产生 onNext 调用时 switchMap 取消了之前的订阅,目前它在 Observable.interval 每秒发生一次,所以我的想法是取消之前的调用仅当改造调用它时 onNext,即将开关向前移动反应链一步。

我该怎么做?或者有其他解决方案吗?

您可以使用 onBackpressureDropflatMap 且 maxConcurrency 为 1 以确保仍允许更长的调用成功:

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

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