Android 定期调用一个可观察对象,只有在下一个成功时才切换到下一个

Android 定期调用一个可观察对象,只有在下一个成功时才切换到下一个,android,retrofit,rx-java,reactivex,Android,Retrofit,Rx Java,Reactivex,我需要每秒轮询端点,目前我使用 Observable.interval(0, 1, TimeUnit.SECONDS, ioScheduler) .switchMap { return pollWithRetrofit() } 它工作正常,除了通话开始需要1秒以上的处理时间外,因此在我得到任何响应之前,通过swithMap取消改装订阅。它可以连续发生多次,有效地使客户端在长时间内没有来自轮询调用的任何响应。在这种情况下,我不想取消改装呼叫,直到我得到下一个呼叫的响应 我知道switch

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

Observable.interval(0, 1, TimeUnit.SECONDS, ioScheduler)
    .switchMap { return pollWithRetrofit() }
它工作正常,除了通话开始需要1秒以上的处理时间外,因此在我得到任何响应之前,通过
swithMap
取消改装订阅。它可以连续发生多次,有效地使客户端在长时间内没有来自轮询调用的任何响应。在这种情况下,我不想取消改装呼叫,直到我得到下一个呼叫的响应

我知道
switchMap
在基本订阅生成
onNext
调用时取消上一次订阅,目前它每隔一秒都会通过
可观察的.interval
进行一次,因此我的想法是,只有在改型调用它的
onNext
时才取消上一次调用,即,将开关向前移动一步至反应链


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

您可以使用maxConcurrency为1的
onBackpressureDrop
flatMap
,以确保仍然允许更长的调用成功:

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

您可以使用maxConcurrency为1的
onBackpressureDrop
flatMap
,以确保仍然允许更长的调用成功:

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

fwiw我正在使用下面这样的代码来做类似的事情……我也不完全相信这是最干净的方法(尽管已经成功地工作了一段时间)


(from)

fwiw我正在使用下面这样的代码来做类似的事情……我也不完全相信这是最干净的方法(尽管已经成功地工作了一段时间)



(from)

我是否正确理解,如果调用速度快,它将在调用成功后再次轮询?它将在给定的延迟后再次轮询。我明白了,延迟是从onCompleted()调用时间开始测量的,对吗?这是正确的……这取决于您的特定要求,可能适合也可能不适合谢谢,我喜欢这种方法,但不幸的是,我更希望每秒或多或少地触发调用。我是否正确理解,如果调用速度快,它将在调用成功后再次轮询?它将在给定的延迟后再次轮询。我明白了,延迟是从onCompleted()调用时间来衡量的,对吗?这是正确的…这是,根据您的具体要求,可能适合也可能不适合谢谢,我喜欢这种方法,但不幸的是,我更喜欢每秒或多或少地触发调用。maxConcurrency==1是否意味着两个调用将并行进行?您能否描述两个调用需要1,4秒才能完成的情况,这段代码会发生什么?为什么会这样?这意味着什么?它将跳过这一秒,等待下一秒的空闲时间。哦,很好,谢谢。
.onBackpressureDrop().concatMap
是否也能实现同样的效果?否,concatMap将缓存至少一个挂起的勾号,以便您可以快速连续收到两个调用。maxConcurrency==1是否意味着两个调用将并行进行?您能否描述两个调用需要1,4秒才能完成的情况,这段代码会发生什么?为什么会这样?这意味着什么?它将跳过这一秒,等待下一秒的空闲时间。哦,很好,谢谢。
.onBackpressureDrop().concatMap
是否也能实现同样的效果?否,concatMap将至少缓存一个挂起的勾号,这样您将很快连续收到两个调用。