Rxjava
,因为其基于事件流的链式调用、逻辑简洁 & 使用简单的特色,深受各大 Android
开发者的欢迎。RxJava
中的 背压控制策略,但愿大家会喜欢。
下面再举个例子: java
即出现发送 & 接收事件严重不匹配的问题git
OOM
采用 背压策略。github
下面,我将开始介绍背压策略。缓存
一种 控制事件流速 的策略网络
在 异步订阅关系 中,控制事件发送 & 接收的速度异步
解决了 因被观察者发送事件速度 与 观察者接收事件速度 不匹配(通常是前者 快于 后者),从而致使观察者没法及时响应 / 处理全部 被观察者发送事件 的问题测试
Backpressure
)的原理是什么呢?RxJava1.0
中被观察者的旧实现 Observable
对比RxJava 2.0
观察者模型中,Flowable
究竟是什么呢?它实际上是RxJava 2.0
中被观察者的一种新实现,同时也是背压策略实现的承载者Flowable
在 RxJava2.0
中,采用 Flowable
实现 背压策略spa
RxJava2.0
中,被观察者(Observable
)的一种新实现
Flowable
的特色 具体以下RxJava2.0
与RxJava1.0
的观察者模型的对比图
Flowable
实现背压,而不采用旧的Observable
呢?Observable
没法很好解决背压问题。Flowable
的基础使用很是相似于 Observable
Flowable
的基础使用讲解完Flowable
与Observable
在功能上的区别主要是 多了背压的功能Flowable
在背压策略功能上的使用5.1.1 异步订阅状况.net
下图 = 当缓存区存满时(128个事件)溢出报错的原理图线程
同步订阅 & 异步订阅 的区别在于:
- 同步订阅中,被观察者 & 观察者工做于同1线程
- 同步订阅关系中没有缓存区
因此,实际上并不会出现被观察者发送事件速度 > 观察者接收事件速度的状况。但是,却会出现被观察者发送事件数量 > 观察者接收事件数量的问题。
因此,对于没有缓存区概念的同步订阅关系来讲,单纯采用控制观察者的接收事件数量(响应式拉取)实际上就等于 “单相思”,虽然观察者控制了要接收3个事件,但假设被观察者须要发送4个事件,仍是会出现问题。
在被观察者发送第1个事件后, 就抛出MissingBackpressureException
异常 & 观察者没有收到任何事件
FlowableEmitter
类的requested()
介绍每一个线程中的requested()
的返回值 = 该线程中的request(a)
的a值
对应于同步 & 异步订阅状况 的原理图
为了方便你们理解该策略中的requested()
使用,该节会先讲解同步订阅状况,再讲解异步订阅状况
即在同步订阅状况中,被观察者 经过 FlowableEmitter.requested()
得到了观察者自身接收事件能力,从而根据该信息控制事件发送速度,从而达到了观察者反向控制被观察者的效果
FlowableEmitter.requested()
时,有如下几种使用特性须要注意的:
FlowableEmitter.requested()
减到0时,则表明观察者已经不可接收事件MissingBackpressureException
异常

Subscription.request()
FlowableEmitter.requested()
的返回值 = 0从上面能够看出,因为两者处于不一样线程,因此被观察者 没法经过 FlowableEmitter.requested()
知道观察者自身接收事件能力,即 被观察者不能根据 观察者自身接收事件的能力 控制发送事件的速度。具体请看下面例子
而在异步订阅关系中,反向控制的原理是:经过RxJava
内部固定调用被观察者线程中的request(n)
从而 反向控制被观察者的发送事件速度
那么该何时调用被观察者线程中的request(n)
& n
的值该是多少呢?请继续往下看。
关于RxJava
内部调用request(n)(n = 12八、9六、0)
的逻辑以下:
下面我将用一个例子来演示该原理的逻辑
整个流程 & 测试结果 请看下图
在Flowable的使用中,会被要求传入背压模式参数
 下面我将对每种模式逐一说明。 **模式1:BackpressureStrategy.ERROR** - 问题:发送事件速度 > 接收事件 速度,即流速不匹配
 **模式2:BackpressureStrategy.MISSING** - 问题:发送事件速度 > 接收事件 速度,即流速不匹配
 **模式3:BackpressureStrategy.BUFFER**
能够接收超过原先缓存区大小(128)的事件数量了  **模式4: BackpressureStrategy.DROP**
被观察者一会儿发送了150个事件,点击按钮接收时观察者接收了128个事件;再次点击接收时却没法接受事件,这说明超过缓存区大小的事件被丢弃了。  **模式5:BackpressureStrategy.LATEST**
在使用背压策略模式的时候,有1种状况是须要注意的:
a. 背景
FLowable
可经过本身建立(如上面例子),或经过其余方式自动建立,如interval操做符
b. 冲突
- 对于自身手动建立FLowable
的状况,可经过传入背压模式参数选择背压策略
(即上面描述的)
FLowable
,却没法手动传入传入背压模式参数,那么出现流速不匹配的状况下,该如何选择 背压模式呢?c. 解决方案
RxJava 2.0
内部提供 封装了背压策略模式的方法
- onBackpressureBuffer()
- onBackpressureDrop()
- onBackpressureLatest()
具体使用以下:
从而很好地解决了发送事件 & 接收事件 速度不匹配的问题。
其他方法的做用相似于上面的说背压模式参数,此处不做过多描述。
RxJava 2.0
的背压模式终于讲解完毕本文主要对 Rxjava
的背压模式知识进行讲解
接下来的时间,我将持续推出 Android
中 Rxjava 2.0
的一系列文章,包括原理、操做符、应用场景、背压等等 ,有兴趣能够继续关注Carson_Ho的安卓开发笔记!!