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的安卓開發筆記!!