RxJava2背压管理策略实例解析

1、前言:

在使用RxJava 的背压时,遇到了很多困扰。本文主要是针对RxJava背压策略的5种模式下,观察者和被观察者在不同的线程模式下,表现出的不同的背压管理策略进行讲解。在记录方便以后进行回顾的同时,希望能对有相同困惑的开发者有所帮助。

以下内容和结论是通过在不同背压策略模式,以及被观察者和观察者在不同线程模式下,通过代码运行和调试得出,如有疏漏和错误,欢迎提出指正。

2、相关词汇说明:

  • 线程模式: 指被观察者发送事件和观察者接收事件所运行的线程
    • 不指定线程: 被观察者和观察者都不指定运行的线程(此时两然运行在同一个线程),即都不指定subscribeOn()和observeOn()方法
    • 指定同一个线程: 被观察者和观察者都指定在同一个线程中运行,比如subscribeOn(AndroidSchedulers.mainThread()) 和observeOn(AndroidSchedulers.mainThread())
    • 被观察者和观察者指定在不同线程即异步订阅方式:比如subscribeOn(Schedulers.io())和observeOn(AndroidSchedulers.mainThread())
  • 128缓存池 : RxJava中用于缓存发送的事件,最大容量为128。
  • Buffer缓存池: RxJava中,Buffer模式下,用来缓存发送的事件,容量大小无限制。
  • 96重置原则 : RxJava在使用128缓存池时,并不是每接收到一条事件就将该事件从缓存池中移除。而是每当观察者接收的事件超过96个时,缓存池才会开始更新数据(即将已接收的96条事件从缓存池移除,腾出空间可以存放后面的事件)。各个背压策略在使用到缓存池,并在涉及计算缓存池的剩余容量时,需要考虑到这个缓存池的更新时机。

3、被观察者和观察者不指定线程

事件发送的设定条件: 要发送的事件数量(150) > 能接收的事件数量 (130)
是否存在128缓存池: 不存在
事件发送和接收的顺序: 被观察者发送一个事件观察者接收一个事件之后才能继续发送和接收下一个事件

在不指定线程的模式下,被观察者发送事件和观察者接收事件运行在同一个线程。此时不存在128的缓存池,必须要被观察者发送的事件由观察者接收之后,被观察者才能继续发送下一个事件,观察者才能继续接收该事件。

  • Error模式:

在发送第131条事件时,会报错onError:io.reactivex.exceptions MissingBackpressureException:create: could not emit valuedue to lack of requests,但是因为事件是交替接收的,所以前130个事件的接收都是正常的。
因为观察者发送的事件150条 超出 被观察者能接收的事件130条,而且此种情况不存在128缓存池,所以会报错。

  • Missing模式:

这种情况比较诡异,建议谨慎使用,并不能从官方的说明中找到该场景的解释。

此时的响应式拉取不再起作用,即subscription.request(num)不再起作用。不管观察者是否拉取事件,以及拉取多少条事件,发送的事件全部会被自动接收,即观察者发送150条事件, 被观察者就会自动接收150条事件。

  • Buffer模式:

超出被观察者能接收的事件会被放在Rxjava的无限大的Buffer缓冲池里(非128缓冲池)
前130个事件会正常的发送和接收, 后面20条事件会被存放在Buffer缓冲池中,等待响应式拉取(即subscription.request(num))。

  • Drop模式:

前130个事件会正常的发送和接收,超出的20个事件会被丢弃。

  • Latest模式:

前130个事件会正常的发送和接收, 最后一个也就是第150个事件会被存储,等待响应式拉取(即subscription.request(num))。

Erorr 和 Missing模式下代码和日志展示(其他三个模式的日志请点击下方日志文章链接)
1)Error模式:
Flowable
    .create(FlowableOnSubscribe { e ->
        val threadName = Thread.currentThread().id.toString()
        Log.d(TAG, "被观察者线程id: " + threadName + "  开始发射数据" + System.currentTimeMillis())
        for (i in 0..150) {
            Log.d(TAG, "被观察者线程id: " + threadName + "  发射---->" + i)
            e.onNext(i)
            try {
                Thread.sleep(10)//每隔10毫秒发射一次数据
            } catch (ex: Exception) {
                e.onError(ex)
            }
        }
        Log.d(TAG, "被观察者线程id: " + threadName + "  发射数据结束" + System.currentTimeMillis())
        e.onComplete()
    }, BackpressureStrategy.ERROR)
    .subscribe(object : Subscriber {
        override fun onSubscribe(s: Subscription) {
            s.request(130)            //注意此处,暂时先这么设置
            mSubscription = s
        }
        override fun onNext(integer: Int?) {
            try {
                Thread.sleep(20)//每隔20毫秒接收一次数据
            } catch (ignore: InterruptedException) {
            }
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收---------->" + integer)
        }
        override fun onError(t: Throwable) {
            Log.d(
                TAG,
                "观察者线程id: " + Thread.currentThread().id.toString() + "  onError: ---------->" + t
            )
        }
        override fun onComplete() {
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收----> 完成")
        }
    })

........
06-06 11:00:50.846 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->124
06-06 11:00:50.866 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->124
06-06 11:00:50.876 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->125
06-06 11:00:50.897 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->125
06-06 11:00:50.907 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->126
06-06 11:00:50.927 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->126
06-06 11:00:50.947 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->127
06-06 11:00:50.967 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->127
06-06 11:00:50.977 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->128
06-06 11:00:50.997 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->128
06-06 11:00:51.007 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->129
06-06 11:00:51.027 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->129
06-06 11:00:51.037 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->130
06-06 11:00:51.047 31450-31450/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 onError:---->io.reactivex.exceptions.MissingBackpressureException: create: could not emit value due to lack of requests
06-06 11:00:51.057 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->131
06-06 11:00:51.067 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->132
06-06 11:00:51.077 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->133
06-06 11:00:51.087 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->134
06-06 11:00:51.097 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->135
06-06 11:00:51.107 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->136
06-06 11:00:51.117 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->137
06-06 11:00:51.137 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->138
06-06 11:00:51.147 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->139
06-06 11:00:51.157 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->140
06-06 11:00:51.167 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->141
06-06 11:00:51.177 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->142
06-06 11:00:51.187 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->143
06-06 11:00:51.197 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->144
06-06 11:00:51.217 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->145
06-06 11:00:51.227 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->146
06-06 11:00:51.237 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->147
06-06 11:00:51.247 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->148
06-06 11:00:51.257 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->149
06-06 11:00:51.267 31450-31450/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->150

2)Missing模式: (可以看到 s.request(130) 是注释掉的,仍然可以接收事件)
Flowable
    .create(FlowableOnSubscribe { e ->
        val threadName = Thread.currentThread().id.toString()
        Log.d(TAG, "被观察者线程id: " + threadName + "  开始发射数据" + System.currentTimeMillis())
        for (i in 0..150) {
            Log.d(TAG, "被观察者线程id: " + threadName + "  发射---->" + i)
            e.onNext(i)
            try {
                Thread.sleep(10)//每隔10毫秒发射一次数据
            } catch (ex: Exception) {
                e.onError(ex)
            }
        }
        Log.d(TAG, "被观察者线程id: " + threadName + "  发射数据结束" + System.currentTimeMillis())
        e.onComplete()
    }, BackpressureStrategy.MISSING)
    .subscribe(object : Subscriber {
        override fun onSubscribe(s: Subscription) {
            //s.request(130)            //注意此处,暂时先这么设置
            mSubscription = s
        }
        override fun onNext(integer: Int?) {
            try {
                Thread.sleep(20)//每隔20毫秒接收一次数据
            } catch (ignore: InterruptedException) {
            }
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收---->" + integer)
        }
        override fun onError(t: Throwable) {
            Log.d(
                TAG,
                "观察者线程id: " + Thread.currentThread().id.toString() + "  onError:---->" + t
            )
        }
        override fun onComplete() {
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收----> 完成")
        }
    })

.......
06-06 11:06:31.929 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->140
06-06 11:06:31.949 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->140
06-06 11:06:31.959 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->141
06-06 11:06:31.989 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->141
06-06 11:06:31.999 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->142
06-06 11:06:32.019 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->142
06-06 11:06:32.029 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->143
06-06 11:06:32.049 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->143
06-06 11:06:32.059 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->144
06-06 11:06:32.079 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->144
06-06 11:06:32.089 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->145
06-06 11:06:32.109 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->145
06-06 11:06:32.129 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->146
06-06 11:06:32.149 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->146
06-06 11:06:32.159 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->147
06-06 11:06:32.179 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->147
06-06 11:06:32.189 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->148
06-06 11:06:32.210 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->148
06-06 11:06:32.230 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->149
06-06 11:06:32.250 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->149
06-06 11:06:32.260 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->150
06-06 11:06:32.280 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->150
06-06 11:06:32.290 32044-32044/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射数据结束1559790392297
06-06 11:06:32.290 32044-32044/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收----> 完成

4、被观察者和观察者指定在同一个线程

事件发送的设定条件: 要发送的事件数量(150) > 能接收的事件数量 (130)
是否存在128缓存池: Error Missing 不存在128缓冲池,Drop Buffer Latest存在128缓冲池
事件发送和接收的顺序: 将所有事件都发送之后,才开始接收事件

在指定同一个线程的模式下,被观察者发送事件和观察者接收事件运行在同一个线程。此时事件发送和接收的顺序为: 将所有事件都发送之后,才开始接收事件

  • Error模式:

在发送完第150条事件时,会报错onError。因为要等全部事件发送成功之后才能接收,而在发送第131条事件之后,RxJava发现观察者能接收的事件数量少于被观察者发送的事件总数,而且又没有任何缓存池, 所以此时所有事件都不能被成功接收。

  • Missing模式:

这种情况又不同于上述不指定线程的Missing模式,使用时需要注意。
在发送完第150条数据时,会报错onError:io.reactivex.exceptions.MissingBackpressureException Queue is full?!

  • Buffer模式:

此模式下存在128缓存池。
前128条事件,会被存放在128缓冲池,超出128的事件,会被放在Buffer缓冲池。
即前130条数据都可以被正常的拉取,剩余的事件,存放在Buffer缓冲池中,等待被拉取。

  • Drop模式:

此模式下存在128缓存池。
前128条事件,会被存放在128缓冲池, 超出的22个事件会被丢弃。

  • Latest模式:

此模式下存在128缓存池。
前128条事件,会被存放在128缓冲池,最后一个也就是第150条事件会被存储 ,而且会被接收(加上这一条正好是129条,请求最大数量是130条)

Erorr 和Latest模式下代码和日志展示(其他三个模式的日志请点击下方日志文章链接)
1)Error模式:
Flowable
    .create(FlowableOnSubscribe { e ->
        val threadName = Thread.currentThread().id.toString()
        Log.d(TAG, "被观察者线程id: " + threadName + "  开始发射数据" + System.currentTimeMillis())
        for (i in 0..150) {
            Log.d(TAG, "被观察者线程id: " + threadName + "  发射---->" + i)
            e.onNext(i)
            try {
                Thread.sleep(10)//每隔10毫秒发射一次数据
            } catch (ex: Exception) {
                e.onError(ex)
            }
        }
        Log.d(TAG, "被观察者线程id: " + threadName + "  发射数据结束" + System.currentTimeMillis())
        e.onComplete()
    }, BackpressureStrategy.ERROR)
    .subscribeOn(AndroidSchedulers.mainThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Subscriber {
        override fun onSubscribe(s: Subscription) {
            s.request(130)            //注意此处,暂时先这么设置
            mSubscription = s
        }
        override fun onNext(integer: Int?) {
            try {
                Thread.sleep(20)//每隔20毫秒接收一次数据
            } catch (ignore: InterruptedException) {
            }
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收---->" + integer)
        }
        override fun onError(t: Throwable) {
            Log.d(
                TAG,
                "观察者线程id: " + Thread.currentThread().id.toString() + "  onError: ---->" + t
            )
        }
        override fun onComplete() {
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收----> 完成")
        }
    })

..........
06-06 11:28:50.185 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->142
06-06 11:28:50.195 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->143
06-06 11:28:50.205 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->144
06-06 11:28:50.215 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->145
06-06 11:28:50.225 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->146
06-06 11:28:50.245 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->147
06-06 11:28:50.255 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->148
06-06 11:28:50.265 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->149
06-06 11:28:50.275 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->150
06-06 11:28:50.285 1250-1250/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射数据结束1559791730298
06-06 11:28:50.345 1250-1250/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 onError: ---->io.reactivex.exceptions.MissingBackpressureException: create: could not emit value due to lack of requests

2)Latest模式:
Flowable
    .create(FlowableOnSubscribe { e ->
        val threadName = Thread.currentThread().id.toString()
        Log.d(TAG, "被观察者线程id: " + threadName + "  开始发射数据" + System.currentTimeMillis())
        for (i in 0..150) {
            Log.d(TAG, "被观察者线程id: " + threadName + "  发射---->" + i)
            e.onNext(i)
            try {
                Thread.sleep(10)//每隔10毫秒发射一次数据
            } catch (ex: Exception) {
                e.onError(ex)
            }
        }
        Log.d(TAG, "被观察者线程id: " + threadName + "  发射数据结束" + System.currentTimeMillis())
        e.onComplete()
    }, BackpressureStrategy.LATEST)
    .subscribeOn(AndroidSchedulers.mainThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Subscriber {
        override fun onSubscribe(s: Subscription) {
            s.request(130)            //注意此处,暂时先这么设置
            mSubscription = s
        }
        override fun onNext(integer: Int?) {
            try {
                Thread.sleep(20)//每隔20毫秒接收一次数据
            } catch (ignore: InterruptedException) {
            }
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收---->" + integer)
        }
        override fun onError(t: Throwable) {
            Log.d(
                TAG,
                "观察者线程id: " + Thread.currentThread().id.toString() + "  onError: ---->" + t
            )
        }
        override fun onComplete() {
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收----> 完成")
        }
    })

...............
06-06 11:31:38.439 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->145
06-06 11:31:38.459 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->146
06-06 11:31:38.469 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->147
06-06 11:31:38.479 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->148
06-06 11:31:38.489 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->149
06-06 11:31:38.499 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射---->150
06-06 11:31:38.509 1740-1740/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 1 发射数据结束1559791898518
06-06 11:31:38.579 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->0
06-06 11:31:38.599 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->1
06-06 11:31:38.619 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->2
06-06 11:31:38.639 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->3
06-06 11:31:38.659 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->4
...........
06-06 11:31:41.202 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->123
06-06 11:31:41.232 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->124
06-06 11:31:41.252 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->125
06-06 11:31:41.272 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->126
06-06 11:31:41.292 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->127
06-06 11:31:41.312 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->150
06-06 11:31:41.322 1740-1740/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收----> 完成

5、被观察者和观察者指定在不同线程即异步订阅

事件发送的设定条件: 要发送的事件数量(150) > 能接收的事件数量 (130)
是否存在128缓存池: 均存在128缓存池
事件发送和接收的顺序: 发送事件和接收事件是并发执行的

无补充描述...

  • Error模式:

在128缓冲池满的时候,继续发送事件,会报OnError错误。(遵循96重置原则)

  • Missing模式:

这种情况也不同于之前的两种Missing模式,使用时需要注意。
已接收的事件不再占用128缓冲池,而当剩余要发送的事件超过缓冲池的容量时(体现出来的就是当接收
到10条事件时,而此时要发射第139条事件时)就会报 MissingBackpressureException Queue is full?!(遵循96重置原则)

  • Buffer模式:

前128条事件,会被存放在128缓冲池,超出128的事件,会被放在Buffer缓冲池。
即前130条数据都可以被正常的拉取,剩余的事件,存放在Buffer缓冲池中,等待被拉取。(遵循96重置原则)(和指定相同线程模式完全相同)

  • Drop模式:

前128条事件,会被存放在128缓冲池, 超出的22个事件会被丢弃(遵循96重置原则)(和指定相同线程模式完全相同)

  • Latest模式:

前128条事件,会被存放在128缓冲池,最后一个也就是第150条事件会被存储,而且会被接收(加上这一条正好是129条,请求最大数量是130条,所以会自动接收)(遵循96重置原则)(和指定相同线程模式完全相同)

Missing 和Drop模式下代码和日志展示(其他三个模式的日志请点击最下方日志文章链接)
1)Missing模式: (请求事件改为10条,方便测试)
Flowable
    .create(FlowableOnSubscribe { e ->
        val threadName = Thread.currentThread().id.toString()
        Log.d(TAG, "被观察者线程id: " + threadName + "  开始发射数据" + System.currentTimeMillis())
        for (i in 0..150) {
            Log.d(TAG, "被观察者线程id: " + threadName + "  发射---->" + i)
            e.onNext(i)
            try {
                Thread.sleep(10)//每隔10毫秒发射一次数据
            } catch (ex: Exception) {
                e.onError(ex)
            }
        }
        Log.d(TAG, "被观察者线程id: " + threadName + "  发射数据结束" + System.currentTimeMillis())
        e.onComplete()
    }, BackpressureStrategy.MISSING)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Subscriber {
        override fun onSubscribe(s: Subscription) {
            s.request(10)            //注意此处,暂时先这么设置
            mSubscription = s
        }
        override fun onNext(integer: Int?) {
            try {
                Thread.sleep(20)//每隔20毫秒接收一次数据
            } catch (ignore: InterruptedException) {
            }
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收---->" + integer)
        }
        override fun onError(t: Throwable) {
            Log.d(
                TAG,
                "观察者线程id: " + Thread.currentThread().id.toString() + "  onError: ---->" + t
            )
        }
        override fun onComplete() {
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收----> 完成")
        }
    })

06-06 11:48:35.531 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 开始发射数据1559792915547
06-06 11:48:35.531 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->0
06-06 11:48:35.541 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->1
06-06 11:48:35.551 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->0
06-06 11:48:35.551 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->2
06-06 11:48:35.571 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->3
06-06 11:48:35.571 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->1
06-06 11:48:35.581 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->4
06-06 11:48:35.591 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->5
06-06 11:48:35.591 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->2
06-06 11:48:35.601 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->6
06-06 11:48:35.611 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->7
06-06 11:48:35.611 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->3
06-06 11:48:35.621 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->8
06-06 11:48:35.631 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->9
06-06 11:48:35.631 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->4
06-06 11:48:35.641 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->10
06-06 11:48:35.651 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->11
06-06 11:48:35.661 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->5
06-06 11:48:35.661 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->12
06-06 11:48:35.671 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->13
06-06 11:48:35.681 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->6
06-06 11:48:35.681 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->14
06-06 11:48:35.691 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->15
06-06 11:48:35.701 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->7
06-06 11:48:35.701 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->16
06-06 11:48:35.711 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->17
06-06 11:48:35.721 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->8
06-06 11:48:35.721 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->18
06-06 11:48:35.731 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->19
06-06 11:48:35.741 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->9
06-06 11:48:35.751 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->20
06-06 11:48:35.762 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->21
06-06 11:48:35.772 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->22
...............
06-06 11:48:37.113 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->135
06-06 11:48:37.133 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->136
06-06 11:48:37.143 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->137
06-06 11:48:37.153 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->138
06-06 11:48:37.163 2614-2614/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 onError: ---->io.reactivex.exceptions.MissingBackpressureException: Queue is full?!
06-06 11:48:37.173 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->139
06-06 11:48:37.183 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->140
06-06 11:48:37.193 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->141
06-06 11:48:37.203 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->142
06-06 11:48:37.213 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->143
06-06 11:48:37.223 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->144
06-06 11:48:37.233 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->145
06-06 11:48:37.253 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->146
06-06 11:48:37.263 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->147
06-06 11:48:37.273 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->148
06-06 11:48:37.283 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->149
06-06 11:48:37.293 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射---->150
06-06 11:48:37.303 2614-2680/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 4827 发射数据结束1559792917318

2)Drop模式: (请求事件改为135条,同时调整被观察者和观察者的速率,使观察者在接收第96条数据的时候,被观察者此时还在发送事件,而且是在发送超过128的事件。通过这种方式说明96缓存池重置原则)
Flowable
    .create(FlowableOnSubscribe { e ->
        val threadName = Thread.currentThread().id.toString()
        Log.d(TAG, "被观察者线程id: " + threadName + "  开始发射数据" + System.currentTimeMillis())
        for (i in 1..150) {
            Log.d(TAG, "被观察者线程id: " + threadName + "  发射---->" + i)
            e.onNext(i)
            try {
                Thread.sleep(10)//每隔10毫秒发射一次数据
            } catch (ex: Exception) {
                e.onError(ex)
            }
        }
        Log.d(TAG, "被观察者线程id: " + threadName + "  发射数据结束" + System.currentTimeMillis())
        e.onComplete()
    }, BackpressureStrategy.DROP)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Subscriber {
        override fun onSubscribe(s: Subscription) {
            s.request(135)            //注意此处,暂时先这么设置
            mSubscription = s
        }
        override fun onNext(integer: Int?) {
            try {
                Thread.sleep(15)//每隔20毫秒接收一次数据
            } catch (ignore: InterruptedException) {
            }
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收---->" + integer)
        }
        override fun onError(t: Throwable) {
            Log.d(
                TAG,
                "观察者线程id: " + Thread.currentThread().id.toString() + "  onError: ---->" + t
            )
        }
        override fun onComplete() {
            Log.d(TAG, "观察者线程id: " + Thread.currentThread().id.toString() + "  接收----> 完成")
        }
    })

...........
06-06 12:11:39.281 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->124
06-06 12:11:39.281 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->86
06-06 12:11:39.291 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->125
06-06 12:11:39.301 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->126
06-06 12:11:39.301 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->87
06-06 12:11:39.311 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->127
06-06 12:11:39.321 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->88
06-06 12:11:39.321 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->128
06-06 12:11:39.331 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->129
06-06 12:11:39.331 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->89
06-06 12:11:39.341 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->130
06-06 12:11:39.351 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->90
06-06 12:11:39.351 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->131
06-06 12:11:39.371 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->132
06-06 12:11:39.371 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->91
06-06 12:11:39.381 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->133
06-06 12:11:39.381 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->92
06-06 12:11:39.401 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->134
06-06 12:11:39.401 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->93
06-06 12:11:39.411 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->135
06-06 12:11:39.421 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->94
06-06 12:11:39.421 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->136
06-06 12:11:39.431 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->137
06-06 12:11:39.431 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->95
06-06 12:11:39.441 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->138
06-06 12:11:39.451 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->96
06-06 12:11:39.451 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->139
06-06 12:11:39.471 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->140
06-06 12:11:39.471 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->97
06-06 12:11:39.481 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->141
06-06 12:11:39.481 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->98
06-06 12:11:39.491 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->142
06-06 12:11:39.501 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->99
06-06 12:11:39.501 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->143
06-06 12:11:39.512 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->144
06-06 12:11:39.522 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->100
06-06 12:11:39.522 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->145
06-06 12:11:39.532 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->101
06-06 12:11:39.542 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->146
06-06 12:11:39.552 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->147
06-06 12:11:39.552 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->102
06-06 12:11:39.562 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->148
06-06 12:11:39.582 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->103
06-06 12:11:39.582 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->149
06-06 12:11:39.592 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射---->150
06-06 12:11:39.592 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->104
06-06 12:11:39.602 6745-6787/com.example.rxjavabackpressure D/MainActivity: 被观察者线程id: 5042 发射数据结束1559794299616
06-06 12:11:39.612 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->105
06-06 12:11:39.622 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->106
06-06 12:11:39.642 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->107
06-06 12:11:39.662 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->108
06-06 12:11:39.672 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->109
06-06 12:11:39.692 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->110
06-06 12:11:39.702 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->111
06-06 12:11:39.722 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->112
06-06 12:11:39.732 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->113
06-06 12:11:39.762 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->114
06-06 12:11:39.782 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->115
06-06 12:11:39.802 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->116
06-06 12:11:39.822 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->117
06-06 12:11:39.832 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->118
06-06 12:11:39.852 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->119
06-06 12:11:39.862 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->120
06-06 12:11:39.882 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->121
06-06 12:11:39.902 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->122
06-06 12:11:39.912 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->123
06-06 12:11:39.932 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->124
06-06 12:11:39.952 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->125
06-06 12:11:39.962 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->126
06-06 12:11:39.982 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->127
06-06 12:11:39.992 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->128
06-06 12:11:40.012 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->139
06-06 12:11:40.032 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->140
06-06 12:11:40.052 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->141
06-06 12:11:40.062 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->142
06-06 12:11:40.082 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->143
06-06 12:11:40.092 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->144
06-06 12:11:40.112 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->145

96重置原则的重要说明:

从上述日志可以看出,当被观察者发送第129条数据,此时观察者接收的事件为89,还没达到缓存池重置时机的96条的阈值。那么在观察者接收89~96事件的过程中,被观察者发送的128 ~138 事件都会丢失。 而当观察者接收到96条事件后,128缓存池会进行重置。此时被观察者发送的139及之后的事件会被放在缓存池中,就可以继续被接收到。所以最后接收的结果也是完全正确的(接收事件128之后,会继续接收139及之后的事件):

...........
06-06 12:11:39.932 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->124
06-06 12:11:39.952 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->125
06-06 12:11:39.962 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->126
06-06 12:11:39.982 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->127
06-06 12:11:39.992 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->128
06-06 12:11:40.012 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->139
06-06 12:11:40.032 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->140
06-06 12:11:40.052 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->141
06-06 12:11:40.062 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->142
06-06 12:11:40.082 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->143
06-06 12:11:40.092 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->144
06-06 12:11:40.112 6745-6745/com.example.rxjavabackpressure D/MainActivity: 观察者线程id: 1 接收---->145

6、将上述的结论汇总在表格中,方便大家针对不同线程模式和不同背压策略的场景进行对比和分析。

RxJava2背压管理策略实例解析_第1张图片
背压策略分析.png

7、各个线程模式和背压策略下的日志打印,有需要的话可以查阅参考。

这里Demo中的相关的日志打印格式,事件发送数量以及发送速率和上文中的日志不一定完全相同,但同样可以完整并正确表达不同场景下的背压策略。

1、Rxjava2背压管理策略不指定线程Demo日志
2、Rxjava2背压管理策略指定相同线程Demo日志
3、Rxjava2背压管理策略指定不同线程Demo日志

你可能感兴趣的:(RxJava2背压管理策略实例解析)