Rxjava-基礎(chǔ)知識

rxjava

五種觀察者模式

被觀察者 觀察者 描述
Observable Observer 能夠發(fā)射0或n個數(shù)據(jù),并以成功或失敗結(jié)束
Flowable Subscriber 能夠發(fā)射0或n個數(shù)據(jù),并以成功或失敗結(jié)束。支持背壓,可以控制數(shù)據(jù)源的發(fā)射速度
Single SingleObserver 只發(fā)射單個數(shù)據(jù)或錯誤事件
Comletable CompleteableObserver 從來不發(fā)射數(shù)據(jù),只處理onComplete和onError事件,可以看成Rx的Runnable
Maybe MabyeObserver 能夠發(fā)射0或1個數(shù)據(jù),要么成功,要么失敗,有點類似于Optional

do操作符

do操作符給Observable的聲明周期的各個階段加上一些列的回調(diào)監(jiān)聽。

下表總結(jié)了一些常用的do操作符,按照執(zhí)行的順序。

操作符 描述
doOnSubscribe 一旦觀察者訂閱了Observable,它就會被調(diào)用
doOnLifeCycle 可以在觀察者訂閱之后,設(shè)置是否取消訂閱
doOnNext 它產(chǎn)生的observable每發(fā)射一項數(shù)據(jù)就會調(diào)用它一次,它的Consumer接受發(fā)射的數(shù)據(jù)項。一般用于在subscribe之前對數(shù)據(jù)進行處理
doOnEach 它產(chǎn)生的Observable沒法涉一項數(shù)據(jù)就會調(diào)用它一次,不僅包括onNext,還包括onError和onCompleted
doOnAfterNext 在onNext之后執(zhí)行,而doOnNext在onNext之前執(zhí)行
doOnComplete 它產(chǎn)生的Observable在正常終止調(diào)用onComplete時被調(diào)用
doFinally 當它產(chǎn)生的Observable終止之后會被調(diào)用,無論是正常終止還是異常終止。doFinally優(yōu)先doAfterTerminate的調(diào)用
doAfterTerminate 注冊一個Action,當Observable調(diào)用onComplete或onError時觸發(fā)

Observable分類

observable分為Hot和Cold。

Hot Observable無論有沒有觀察者進行訂閱,事件始終會發(fā)生。當Hot Observable有多個訂閱者時,Hot Observable與訂閱者們的關(guān)系是一對多的關(guān)系,可以與多個訂閱者共享信息。

Cold Observable是只有觀察者訂閱了,才開始執(zhí)行發(fā)射數(shù)據(jù)流的代碼。并且Cold Observable和Observer只能是一對一的關(guān)系。當有多個不同的訂閱者時,消息是重新完整發(fā)送的。也就是說對Cold Observable而言,有多個Observser的時候,他們各自的消息是獨立的。

Cold Observable

Observable的just,create,range,fromXXX等操作符都能生成Cold Observable。

Cold Observable和Hot Observable的轉(zhuǎn)換

  1. 使用publish,生成ConnectableObservable,將原來的Observable轉(zhuǎn)換成ConnectableObservable。
  2. 使用Subject/Processor。Subject和Processor作用相同,Processor是RxJava 2.x新增的類,繼承自Flowable,支持背壓控制(Back Presure),而Subject則不支持背壓控制。Subject既是Observable又是Observer。Subject作為觀察者,可以訂閱目標Cold Observable,使對方開始發(fā)送事件,同時它又作為Observable轉(zhuǎn)發(fā)或者發(fā)送新的事件,讓Cold Observable借助Subject轉(zhuǎn)換為Hot Observable。Subject不是線程安全的,如果想要線程安全,則需要調(diào)用toSerialized()。

熱Observable轉(zhuǎn)為Cold Observable

  1. 使用ConnectableObservable的refCount操作符。refcount操作符把從一個可連接的Observable連接和斷開過程自動化了。操作一個Observable,返回一個普通的Observable,當?shù)谝粋€訂閱者/觀察者訂閱這個Observable時,RefCount連接到下層的可連接Observable,RefCount跟蹤有多少個觀察者訂閱它,指導最后一個觀察者完成,才斷開與下層Observable的連接。如果所有的訂閱者/觀察者都取消訂閱了,則數(shù)據(jù)流停止,如果重新訂閱,則重新開始數(shù)據(jù)流。如果部分觀察者取消訂閱,則部分觀察者重新訂閱,則不會從頭開始數(shù)據(jù)流。

  2. 使用share操作符。share操作符封裝了publish().refCount()調(diào)用。不需要再調(diào)用connect方法,直接使用share方法即可。

Flowable

RxJava2.x新增,支持背壓。

Maybe,Single,Completable

Single

只有onSUccess,onError事件。onSuccess用于發(fā)射數(shù)據(jù),且只能發(fā)射一個數(shù)據(jù),后續(xù)數(shù)據(jù)拋棄。

Subject

Subject既是Observable又是Observer。分為AsyncSubject,BehaviorSubject,ReplaySUbject,PublishSubject。

Subject 發(fā)射行為
AsyncSubject 不論訂閱發(fā)生在什么時候,只發(fā)射最后一個數(shù)據(jù)
BehaviorSubject 發(fā)射訂閱前的一個數(shù)據(jù),和訂閱之后的全部數(shù)據(jù)
ReplaySubject 不論什么時候訂閱,都發(fā)射全部數(shù)據(jù)
PublishSubject 發(fā)射訂閱后的全部數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容