RxJava補(bǔ)充筆記

Observalbe的訂閱與事件發(fā)送過(guò)程的關(guān)聯(lián)

Cold Observalbes:多次訂閱都重用同一個(gè)Observalbe對(duì)象,每次訂閱都自動(dòng)重演一次事件發(fā)送流程(并行啟動(dòng)多個(gè)獨(dú)立事件發(fā)送流)
defer(Func0):每次訂閱重建一個(gè)新Observalbe對(duì)象
cache:每次訂閱都發(fā)送之前緩存的舊事件,不重演事件發(fā)送流程

Connectable Observables (Hot):多次訂閱都重用同一個(gè)Observalbe對(duì)象,通過(guò) connect 函數(shù)手動(dòng)啟動(dòng)事件發(fā)送,每次訂閱僅能接收訂閱后發(fā)送的事件(僅啟動(dòng)單個(gè)事件發(fā)送流,不重演)
replay:多次訂閱都重用同一個(gè)Observalbe對(duì)象,每次訂閱都重放一次事件發(fā)送流程(緩存舊事件),允許通過(guò)附加參數(shù)指定緩存區(qū)大?。ɑ蛴行r(shí)間窗口長(zhǎng)度),相當(dāng)于Cold Observalbes中的cache操作

Observable的Cold-Hot轉(zhuǎn)化

publish:將Cold Observalbe轉(zhuǎn)化為Connectable Observable
refCount:將Connectable Observable轉(zhuǎn)化為Cold(偽) Observalbe(本質(zhì)為自動(dòng)引用計(jì)數(shù),自動(dòng)追蹤維護(hù)新訂閱者與源Connectable Observable的connect關(guān)系,但不改變單一事件發(fā)送流的實(shí)質(zhì),共享同一事件對(duì)象,且只能接收訂閱后發(fā)送的事件,即變成單一事件發(fā)送流的Cold Observalbe,首單訂閱發(fā)生時(shí)自動(dòng)開(kāi)始發(fā)送事件,最后一個(gè)訂閱者失效時(shí)事件發(fā)送自動(dòng)結(jié)束)
share:直接等于publish+refCount,將普通Cold Observable轉(zhuǎn)化為單一事件發(fā)送流的Cold Observalbe,共享事件對(duì)象

難以理解的Join

join(targetObservable, leftTimer, rightTimer, resultFunc):源Observalbe與目標(biāo)Observalbe發(fā)送的事件進(jìn)行融合,成為新事件并發(fā)出。即帶時(shí)效版本的combineLatest。leftTimer函數(shù)接收源Observalbe事件,并據(jù)此產(chǎn)生臨時(shí)Observalbe<?>,以其生命周期長(zhǎng)度作為源Observalbe的每個(gè)獨(dú)立事件的有效緩存期,rightTimer函數(shù)則以相同方式作為目標(biāo)Observalbe的事件有效緩存期,雙方每次發(fā)送的事件時(shí)刻若落在對(duì)方最近一次事件的有效緩存期內(nèi),則取出雙方事件,通過(guò)resultFunc<T1,T2,R>函數(shù)進(jìn)行組合運(yùn)算,得到本次實(shí)際發(fā)送的結(jié)果事件R。

groupJoin(targetObservable, leftTimer, rightTimer, resultFunc):與join相同,但resultFunc函數(shù)參數(shù)為源Observalbe的一個(gè)事件A,以及在該事件有效緩存期間,由目標(biāo)Observalbe發(fā)送的事件序列構(gòu)成的子集Observalbe<T2>(包括之前發(fā)出但有效緩存期抵達(dá)事件A發(fā)出時(shí)刻的歷史緩存事件),并返回一個(gè)事件融合結(jié)果合集Observalbe<R>(通常可通過(guò)目標(biāo)子集Observalbe.map()方法得到每個(gè)目標(biāo)事件與事件A加成的結(jié)果合集)。該函數(shù)最后的所有結(jié)果合集Observalbe<R>所發(fā)送的所有事件將被抽出匯入主事件流(即訂閱時(shí),得到的事件類(lèi)型為該函數(shù)的合集Observalbe單個(gè)事件類(lèi)型R)。

debounce(Func1->Observable) 源Observable發(fā)射一個(gè)新事件的時(shí)候,如果上一個(gè)事件通過(guò)函數(shù)Func1產(chǎn)生的臨時(shí)Observable未結(jié)束,則上次的事件將被拋棄。(事件僅在臨時(shí)Observable結(jié)束一刻實(shí)際發(fā)出)

重啟訂閱

repeat,在源Observable發(fā)出onCompleted事件后觸發(fā)重訂閱。
retry,在源Observable發(fā)出onError事件后觸發(fā)重訂閱。
retryWhen(Func1<Observable<Throwable> errorOb, Observable notiOb>)
每次源Observable發(fā)出onError事件,都會(huì)重用errorOb對(duì)象并傳入發(fā)送新的error實(shí)體,并重用notiOb據(jù)此error決定發(fā)送onNext或complete、error終止事件,據(jù)此行為決定是否重啟源Observable訂閱。通常errorOb.flatMap->Observable.just(null)就足夠了。需要拒絕重試,可errorOb.flatMap->Observable.error(error)。

Blocking Observable

BlockingObservable是阻塞型的Observable類(lèi)型,主要用于測(cè)試和demo試驗(yàn),通常不適宜用于產(chǎn)品開(kāi)發(fā)。(當(dāng)產(chǎn)品開(kāi)發(fā)依賴(lài)于阻塞類(lèi)型過(guò)程時(shí),通常意味著設(shè)計(jì)不當(dāng))
BlockingObservable的事件發(fā)送依賴(lài)于其阻塞方法的顯式調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的,對(duì)什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,984評(píng)論 0 10
  • 我從去年開(kāi)始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,763評(píng)論 7 62
  • 前言 按照官方的分類(lèi),操作符大致分為以下幾種: Creating Observables(Observable的創(chuàng)...
    小玉1991閱讀 1,116評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 前言我從去年開(kāi)始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,315評(píng)論 6 151

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