我需要每秒轮询端点,目前我用
进行Observable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
.switchMap { return pollWithRetrofit() }
除了处理开始时间超过1秒的情况之外,它工作正常,因此在我得到任何响应之前,swithMap
取消了改装订阅。它可以连续多次发生,有效地使客户端长时间没有来自轮询呼叫的任何响应。在这种情况下,我希望在下次通话收到回复之前不要取消改装电话。
我知道switchMap
在基本订阅产生onNext
电话时取消之前的订阅,目前它每隔一秒由Observable.interval
发生,所以我的想法是取消之前的电话改造称之为onNext
,即将转换向前移动一步反应链。
我该怎么做?还是有其他解决方案吗?
答案 0 :(得分:2)
您可以使用onBackpressureDrop
和flatMap
,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)