了解可流动的背压rxjava2

时间:2017-07-17 02:23:30

标签: rx-java2

我把这个虚拟的例子放在一起,试图更好地理解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,没有遗漏的元素。

所以我想知道如何为慢速用户模拟用户丢失的事件? 如何才能发生背压异常?

由于

1 个答案:

答案 0 :(得分:4)

observeOn的默认内部缓冲区大小为128,这就是为什么你没有看到删除的元素,因为它可以简单地缓冲你正在生成的所有100个元素。您可以通过observeOn(mainThread(), false, 1)将缓冲区大小设置为1并体验丢弃。