我把这个虚拟的例子放在一起,试图更好地理解backpressure
:
Flowable.range(1, 100).onBackpressureDrop()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(object : DisposableSubscriber<Int>() {
override fun onStart() {
request(1)
}
override fun onComplete() {
Log.d(this@MainActivity::class.java.simpleName, "onComplete")
}
override fun onNext(t: Int?) {
Log.d(this@MainActivity::class.java.simpleName, t.toString())
Thread.sleep(1000)
request(1)
}
override fun onError(t: Throwable?) { //handle error}
})
我的速度非常慢Subscriber
会消耗非常快Flowable
的数据。而且我正在指示Flowable onBackPressureDrop()
。尽管如此,我的输出看起来像这样(从1到100)
07-16 23:07:21.097 22389-22389 D: 1
07-16 23:07:22.100 22389-22389 D: 2
07-16 23:07:23.102 22389-22389 D: 3
07-16 23:07:24.104 22389-22389 D: ...
07-16 23:07:24.104 22389-22389 D: ...
07-16 23:07:24.105 22389-22389 D: 99
07-16 23:07:25.105 22389-22389 D: 100
07-16 23:07:25.107 22389-22389 D: onComplete
由于订阅者速度极慢,我期待缺少元素,但事实并非如此,所有从1到100的数字都会打印到控制台,每秒一个。
接下来,我尝试一次请求所有值。因此,我使用request(1)
替换了onStart
中的request(Long.MAX_VALUE)
,并从request(1)
调用中删除了onNext
。但它仍然打印数字1到100,没有遗漏的元素。
所以我想知道如何为慢速用户模拟用户丢失的事件? 如何才能发生背压异常?
由于
答案 0 :(得分:4)
observeOn
的默认内部缓冲区大小为128,这就是为什么你没有看到删除的元素,因为它可以简单地缓冲你正在生成的所有100个元素。您可以通过observeOn(mainThread(), false, 1)
将缓冲区大小设置为1并体验丢弃。