-
概念
- 一個(gè)在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫
- 響應(yīng)式編程框架(擴(kuò)展)
- 擴(kuò)展的觀察者模式
-
響應(yīng)類型
-
Observable/Observer
:常用e.onNext
/onSubscribe、onNext、onError、onComplete
-
Flowable/Subscriber
:支持背壓(背壓是流速控制的一種策略)(被觀察者發(fā)送速度遠(yuǎn)快于觀察者處理速度的情況,告訴上游的被觀察者降低發(fā)送速度的策略) -
Single/SingleObserver
:只能接收一次 -
Completable/CompletableObserver
:只能接收onComplete、onError -
Maybe/MaybeObserver
:Single和Completable的結(jié)合 -
Subject/Processors
:即可以做Observer也可以做Observable(RxBus類似EventBus)
-
-
線程切換
-
subscribeOn()
指定的就是發(fā)射事件的線程(多次指定發(fā)射事件的線程只有第一次指定的有效) -
observerOn()
指定的就是訂閱者接收事件的線程(每調(diào)用一次 observerOn(),下游的線程就會(huì)切換一次) - 默認(rèn)線程選項(xiàng)
-
Schedulers.io()
代表io操作的線程, 通常用于網(wǎng)絡(luò),讀寫文件等io密集型的操作 -
Schedulers.computation()
代表CPU計(jì)算密集型的操作, 例如需要大量計(jì)算的操作 -
Schedulers.newThread()
代表一個(gè)常規(guī)的新線程 -
AndroidSchedulers.mainThread()
代表Android的主線程
-
-
-
常用操作符
- 創(chuàng)建操作:Create、From、Just、Defer、Interval
- 變換操作:Map、FlatMap、ConcatMap
- 過濾操作:Debounce、Distinct、Filter、Skip、Take
- 組合操作:Merge、Zip
-
遇到的坑
- 越來越多的訂閱,內(nèi)存開銷也會(huì)變得很大,最終導(dǎo)致OOM,onDestroy取消訂閱
- 線程調(diào)度,沒有用到指定線程
-
流程源碼
- 從入口類Observable分析,Observable是一個(gè)抽象類,實(shí)現(xiàn)了
ObservableSource
接口,并留了subscribeActual
這個(gè)抽象方法。ObservableSource
接口只定義了subscribe()
,這個(gè)方法做了一些基礎(chǔ)判斷之后直接跳轉(zhuǎn)到子類的subscribeActual()
,eg:ObservableCreate、ObservableXxx - 1)創(chuàng)建任務(wù)鏈:調(diào)用操作符時(shí)候,其實(shí)只是簡單的封裝了一下上一級(jí)的輸入source,并返回了一個(gè)Observable對象
- 2)逆向逐級(jí)訂閱:
subscribe(observer)->subscribeActual(observer)
,在subscribeActual(observer)
中 ,對應(yīng)source繼續(xù)向上訂閱source.subscribe()
,并且包裝了對應(yīng)操作符的observer
,最后沒有上游會(huì)subscribe
我們創(chuàng)建的Observable,下一級(jí)的Observable會(huì)生成的對應(yīng)的Observer訂閱上一級(jí)的source - 3)執(zhí)行任務(wù)鏈:從
ObservableEmitter.onNext
開始,不斷調(diào)用observer.onNext()
,observer就是對應(yīng)操作符在逆向逐級(jí)訂閱時(shí)候包裝的,最后一層的Observer就是我們調(diào)用subscribe時(shí)傳入的Observer
- 從入口類Observable分析,Observable是一個(gè)抽象類,實(shí)現(xiàn)了
流程圖