如何在Rxjava2中获得有关背压的实际最新事件?Flowable.onBackpressureLatest()未按预期工作

Wil*_* Li 1 backpressure rx-java rx-java2

当生产者生产事件的速度快于客户消费时.

我想用可流动onBackpressureLatest() ,我可以得到最新的情况下发出的.

但事实证明有一个128的默认缓冲区.我得到的是之前缓冲的过时事件.

那么如何才能获得最新的实际活动?

这是示例代码:

Flowable.interval(40, TimeUnit.MILLISECONDS)
            .doOnNext{
                println("doOnNext $it")
            }
            .onBackpressureLatest()
            .observeOn(Schedulers.single())
            .subscribe {
                println("subscribe $it")
                Thread.sleep(100)
            }
Run Code Online (Sandbox Code Playgroud)

我的期望:

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
...
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

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
...
Run Code Online (Sandbox Code Playgroud)

Kis*_*kae 5

您的问题实际上在于observeOn,默认情况下请求最多128个项目并将此请求传递给您backpressureLatest,因此不会像您期望的那样运行.

您可以使用.observeOn(Scheduler,boolean,int)指定缓冲区大小来解决您所看到的行为.