FluxJava 新增 RxJava2 的支援功能

FluxJava 最初的設(shè)計(jì)就是以 Add-on 的方式來(lái)提供對(duì)于 RxJava 的支持炎功,所以這次增加 RxJava2 的部份也依照相同的模式枚冗,在 Project 中加上了 fluxjava-rx2 的 Module。新的 Module 功能上與 fluxjava-rx 大致上相同蛇损,只是原本以 RxJava 規(guī)格運(yùn)作的部份赁温,改為使用 RxJava2。

由于 RxJava 與 RxJava2 不太有機(jī)會(huì)共存在同一個(gè) Module 里淤齐,所以 fluxjava-rx2 沿用了 fluxjava-rx 的 Package 名稱(chēng)股囊,在使用上這二個(gè) Add-on 必須要擇一引用。不過(guò)也帶來(lái)了一個(gè)額外的好處更啄,如果想要由 fluxjava-rx 升級(jí)到 fluxjava-rx2 時(shí)稚疹,只要修改成 RxJava2 的調(diào)用規(guī)格,不用再特別調(diào)整 Import 的內(nèi)容祭务。

配合 RxJava2 的更新贫堰,按照慣例增加了一篇文章手把手教你如何一起用 FluxJava 與 RxJava2 做為使用上的參考穆壕。更多深入的文章請(qǐng)參閱簡(jiǎn)書(shū) http://www.reibang.com/u/fea63707e07fwznote.blogspot.com

在 fluxjava-rx2 中與 fluxjava-rx 最大的差異其屏,主要是因應(yīng) RxJava2 把原本的 Observable 分成了有背壓版本的 Flowable 與沒(méi)有背壓版本的 Observable喇勋。因此 RxBus 與 RxStore 中都分別再提供了 toFlowable 的 Method 來(lái)取得 Flowable,不過(guò) Observable 本來(lái)就可以再轉(zhuǎn)換為 Flowable偎行,此處的功能只是為了增加便利性川背、簡(jiǎn)化源代碼之用。

同時(shí)蛤袒,利用這篇文章補(bǔ)充說(shuō)明一下一些使用上的技術(shù)細(xì)節(jié)熄云。在 RxStore 中使用的是沒(méi)有背壓版本的 Observable 來(lái)接收外部傳來(lái)的信息,只是接收到之后就會(huì)被分派到不同的 Thread 上去處理后續(xù)的工作妙真,所以在這個(gè)部份是不大有機(jī)會(huì)遇上 MissingBackpressureException 問(wèn)題的缴允。但是,這并不代表背壓所造成的情況就不存在了珍德,只是瓶頸移到了 ThreadPool 的承受能力或是執(zhí)行的環(huán)境可以產(chǎn)生 Thread 的數(shù)量上练般。

就算是使用有背壓功能的 Flowable,也不代表就可以高枕無(wú)憂了锈候。說(shuō)穿了薄料,背壓本身不是什么神奇的黑科技,原理上只是在上下游中間加了個(gè)水池泵琳,讓下游有喘息的空間摄职。水池畢竟還是有一定的物理限制,沒(méi)有控制好获列,依舊會(huì)讓水池承載不下而出現(xiàn)錯(cuò)誤谷市。

因此,不論使用哪一種方法击孩,前端發(fā)送的數(shù)量仍然應(yīng)該要被謹(jǐn)慎地控制迫悠,避免海量的信息把接收端給淹沒(méi)了。像是把 RecyclerView 滾動(dòng)時(shí)產(chǎn)生位移的 Event 毫無(wú)選擇地往 RxStore 送。

在發(fā)送端就要篩選信息,除了要減少 MissingBackpressureException 可能會(huì)出現(xiàn)的機(jī)會(huì)外薪寓,還有一個(gè)目的是要節(jié)省執(zhí)行成本。當(dāng)信息數(shù)量大到無(wú)法處理時(shí)验烧,能做的只有挑選值得處理的部份來(lái)進(jìn)行。當(dāng)挑選的工作被移到發(fā)送后又跛,RxJava 的傳送機(jī)制表面上看起來(lái)就是簡(jiǎn)單地轉(zhuǎn)了一手碍拆,但是如果去追蹤其源代碼,就可以發(fā)現(xiàn)其實(shí)底下做了不少的工作。而每一次傳送都要運(yùn)行這些內(nèi)容感混,可以想見(jiàn)在數(shù)量到達(dá)一定的程度之后端幼,就會(huì)顯現(xiàn)出可觀的效能差距。

由于 Observable 在定義上所形成的限制使然弧满,同一個(gè)發(fā)送源無(wú)法把的信息分配至不同的 Thread 上送出婆跑。RxStore 為了要讓每個(gè)資料處理要求可以獨(dú)立、同步地進(jìn)行庭呜,所以才會(huì)在接收到信息后滑进,以不同的 Thread 進(jìn)行后續(xù)的工作。

在 RxStore 里提供了一個(gè) getExecutor Method募谎,可以使用 ThreadPool 來(lái)做為背壓的替代方案扶关,但是并沒(méi)有像背壓一樣有可以控制上游的功能。在實(shí)作 getExecutor 時(shí)要注意数冬,不要直接在回傳時(shí) New 一個(gè) ThreadPool 的 Instance节槐。因?yàn)?getExecutor 是在每一次收到信息后調(diào)用一次。以上的做法拐纱,也等同于每一次收到信息就拿到一個(gè) ThreadPool 的 Instance铜异,每一個(gè) ThreadPool 都只會(huì)產(chǎn)生一個(gè) Thread,這就失去了使用 ThreadPool 的用意戳玫。

最容易出現(xiàn)以上問(wèn)題的情況是使用 Executors 來(lái)取得 ThreadPool熙掺,一般的情況下很容易忽略 Executors 其實(shí)是每次調(diào)用就產(chǎn)生一個(gè) Instance未斑。所以當(dāng)以 return Executors.newFixedThreadPool(poolSize); 的方式回傳 getExecutor 時(shí)咕宿,一開(kāi)始也許顯示不出問(wèn)題而被略過(guò),但是一但信息爆量后蜡秽,就會(huì)因?yàn)楫a(chǎn)生 Thread 的數(shù)量到達(dá)上限而中止運(yùn)作府阀。

以上,是這次補(bǔ)充的內(nèi)容芽突,讓使用 FluxJava 的朋友做為參考试浙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寞蚌,隨后出現(xiàn)的幾起案子田巴,更是在濱河造成了極大的恐慌,老刑警劉巖挟秤,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壹哺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡艘刚,警方通過(guò)查閱死者的電腦和手機(jī)管宵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人箩朴,你說(shuō)我怎么就攤上這事岗喉。” “怎么了炸庞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵钱床,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我埠居,道長(zhǎng)诞丽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任拐格,我火速辦了婚禮僧免,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捏浊。我一直安慰自己懂衩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布金踪。 她就那樣靜靜地躺著浊洞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胡岔。 梳的紋絲不亂的頭發(fā)上法希,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音靶瘸,去河邊找鬼苫亦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怨咪,可吹牛的內(nèi)容都是我干的屋剑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诗眨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唉匾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起匠楚,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巍膘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后芋簿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體峡懈,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年益咬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逮诲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帜平。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖梅鹦,靈堂內(nèi)的尸體忽然破棺而出裆甩,到底是詐尸還是另有隱情,我是刑警寧澤齐唆,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布嗤栓,位于F島的核電站,受9級(jí)特大地震影響箍邮,放射性物質(zhì)發(fā)生泄漏茉帅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一锭弊、第九天 我趴在偏房一處隱蔽的房頂上張望堪澎。 院中可真熱鬧,春花似錦味滞、人聲如沸樱蛤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昨凡。三九已至,卻和暖如春蚁署,著一層夾襖步出監(jiān)牢的瞬間便脊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工光戈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哪痰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓田度,卻偏偏與公主長(zhǎng)得像妒御,于是被迫代替她去往敵國(guó)和親解愤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镇饺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容