当生产者生产事件的速度快于客户消耗的速度时。
我认为将Flowable与onBackpressureLatest()结合使用,可以获取最新的事件。
但是事实证明,这里有一个默认的大小为128的缓冲区。我得到的是以前已过时的事件的缓冲区。
那我如何获得实际的最新事件?
这是示例代码:
Flowable.interval(40, TimeUnit.MILLISECONDS)
.doOnNext{
println("doOnNext $it")
}
.onBackpressureLatest()
.observeOn(Schedulers.single())
.subscribe {
println("subscribe $it")
Thread.sleep(100)
}
我所期望的:
doOnNext 0
subscribe 0
doOnNext 1
doOnNext 2
subscribe 2
doOnNext 3
doOnNext 4
doOnNext 5
subscribe 5
doOnNext 6
doOnNext 7
subscribe 7
doOnNext 8
doOnNext 9
doOnNext 10
subscribe 10
...
我得到了什么
doOnNext 0
subscribe 0
doOnNext 1
doOnNext 2
subscribe 1
doOnNext 3
doOnNext 4
doOnNext 5
subscribe 2
doOnNext 6
doOnNext 7
subscribe 3
doOnNext 8
doOnNext 9
doOnNext 10
subscribe 4
...
doOnNext 325
subscribe 127
doOnNext 326
doOnNext 327
doOnNext 328
subscribe 246
...
答案 0 :(得分:5)
您的问题实际上出在observeOn
上,默认情况下,该请求最多可请求128个项目,并将此请求最多传递到backpressureLatest
,因此,该请求的行为将不符合您的预期。
您可以使用.observeOn(Scheduler,boolean,int)
指定缓冲区大小,该大小应该可以解决您所看到的行为。