RxJava 進(jìn)階之用例總結(jié)(part3)-RxAndroid的例子鬼店,理解RxJava的流概念

相信看完前兩篇文章网棍,相信大家對(duì)RxJava的用例已經(jīng)有個(gè)比較清晰的認(rèn)識(shí)了。今天我們來(lái)看看RxJava的一個(gè)extension-RxAndroid妇智。

RxAndroid的官方Wiki滥玷,和github

1.RxAndroid主線程調(diào)度器

說(shuō)到RxAndroid俘陷,大部分已經(jīng)接觸過(guò)RxJava的同學(xué)都可能看過(guò)這個(gè)類(lèi)似的代碼

mainThread()

沒(méi)錯(cuò)罗捎,就是這個(gè)AndroidSchedulers.mainThread()線程調(diào)度器。在經(jīng)典的安卓后臺(tái)處理拉盾,主線程接收結(jié)果場(chǎng)景中經(jīng)常被使用桨菜。

不過(guò)說(shuō)實(shí)話,我個(gè)人在參與公司的app編寫(xiě)的過(guò)程中捉偏,RxAndroid部分最常用到的也就是這個(gè)調(diào)度器而已了倒得。。夭禽。

真的就這么沒(méi)用嘛

RxAndroid當(dāng)然不止這么點(diǎn)用處霞掺,我們接下來(lái)探索一下其他RxAndroid的用例。

首先我們打開(kāi)RxAndroid的Wiki Page讹躯,可以看到有一大堆extension呢菩彬!


一大堆RxAndroid的extension

今天我們就以其中一個(gè)最常用的RxBinding為例。

RxBinding是用來(lái)干哈的潮梯?我個(gè)人的理解是它是一個(gè)把a(bǔ)ndroid中各種view的listener轉(zhuǎn)換成Rx里面的Observable的一個(gè)庫(kù)骗灶。一個(gè)最簡(jiǎn)單的例子:替換掉view的onClicklistener:

Rxbinding的方式來(lái)監(jiān)聽(tīng)click事件

哈哈!成功啦!我們邁向了RxAndroid的第一步。溉愁。。纳像。。。。我露出了尷尬的笑容

然而這并沒(méi)有什么卵用

乍一看绕娘,這有啥意義嗎?從原來(lái)的setOnclickListener()到現(xiàn)在這個(gè)bingding栽连,并沒(méi)有看到有什么優(yōu)勢(shì)啊业舍。

年輕人別上火,咱們來(lái)仔細(xì)分析一下升酣。既然我們成功的把一個(gè)view的click事件轉(zhuǎn)換成了Observable舷暮,那么我們就可以玩很多花活了,所有在Observable上可以應(yīng)用的操作符我們現(xiàn)在都可以應(yīng)用到android的view上拉噩茄!


2.實(shí)現(xiàn)雙擊響應(yīng)下面!

比如說(shuō),假如我們想實(shí)現(xiàn)一個(gè)按鈕雙擊的響應(yīng)事件绩聘,在android里面應(yīng)該怎么實(shí)現(xiàn)呢沥割?先貼出代碼,我們?cè)僮屑?xì)分析分析凿菩。

雙擊机杜!

可以看到我們?cè)谶@個(gè)例子里面,把原始的textview的observable通過(guò)buffer()操作符改裝了一下衅谷。讓我們看看buffer是干嘛的椒拗。

周期性的把一個(gè)原始的Observable要發(fā)射的元素集中在多個(gè)集合里面,然后把這些集合一個(gè)個(gè)發(fā)射出去(而不是原始的元素)获黔。

這和我們雙擊事件有什么聯(lián)系呢蚀苛?讓我們來(lái)想想,雙擊鼠標(biāo)玷氏,雙擊button堵未,本質(zhì)是什么?本質(zhì)就是在一個(gè)比較短的時(shí)間段內(nèi)盏触,點(diǎn)擊了目標(biāo)兩次渗蟹,不能是一次,也不能是三次赞辩。這個(gè)比較短的時(shí)間是多少雌芽,一秒??jī)擅胧坎恢匾炫隆R驗(yàn)檫@是由開(kāi)發(fā)者自己決定的。那么使用buffer操作符的話召庞,我們可以不斷的監(jiān)聽(tīng)我們的click事件的同時(shí)岛心,把他們按照兩個(gè)兩個(gè)的組合起來(lái),那么每次我們就只處理這個(gè)兩個(gè)點(diǎn)擊事件的集合篮灼,而不是單個(gè)點(diǎn)擊事件忘古。

看看buffer的使用,四個(gè)參數(shù):

四個(gè)參數(shù)

參數(shù)1:時(shí)間段的長(zhǎng)短

參數(shù)2:時(shí)間段的單位

參數(shù)3:我們選擇發(fā)射集合的大小诅诱,這里因?yàn)槲覀冃枰氖请p擊事件髓堪,所以這個(gè)參數(shù)3我們會(huì)選擇2.

參數(shù)4:線程調(diào)度器,這里我們?cè)诎沧康闹骶€程監(jiān)聽(tīng)事件的發(fā)生。

至于在subscribe里面干旁,為什么我們還需要判斷一下list的大惺徽印?

why?

因?yàn)橐坏﹕ubscribe争群,我們的Observable會(huì)每隔一段時(shí)間(就是你定義的時(shí)間),發(fā)射一個(gè)集合回怜,這個(gè)集合可能是空的,或者只含有一個(gè)元素(比如說(shuō)在500ms里面你壓根沒(méi)點(diǎn)擊换薄,或者只點(diǎn)擊了一次)玉雾。


3.優(yōu)雅的響應(yīng)改變

第三部分的例子來(lái)源于這個(gè)家伙寫(xiě)的一個(gè)blog文章,假設(shè)你有一個(gè)textview,和一個(gè)edittext轻要,每次edittext改變的時(shí)候你都想把edittext的內(nèi)容轉(zhuǎn)換順序复旬,并且顯示到textview上面。使用rxbinding將edittext的響應(yīng)事件更優(yōu)雅的來(lái)處理把冲泥!

優(yōu)雅的處理EditText吧


4.上述例子的一些缺點(diǎn)驹碍。

稍微陳述一下上述例子的缺點(diǎn)吧。

首先例子1的雙擊事件柏蘑,每次在subscribe之后幸冻,RxJava都會(huì)開(kāi)啟一個(gè)timer,定時(shí)的去獲取事件咳焚。這樣具體對(duì)手機(jī)power的消耗是否會(huì)增加太多洽损,我不太確定。但是肯定是比不用timer要多的

例子2中革半,RxTextView的textChanges()方法之響應(yīng)了EditText的onTextChanged()方法碑定。beforeTextChanged 和 afterTextChanged是沒(méi)有響應(yīng)的。大家有興趣可以看看它的實(shí)現(xiàn)又官,就是把textwatcher的方法重寫(xiě)延刘,每次onTextChanged的時(shí)候就發(fā)射一個(gè)事件。

5.最后關(guān)于流的思考六敬。

其實(shí)寫(xiě)了這些例子并不是為了要大家就按照我寫(xiě)的去做碘赖,具體項(xiàng)目的需求不一樣,寫(xiě)法肯定也不一樣外构。我寫(xiě)這些的目的是為了讓大家可以明白普泡,RxAndroid的這些extension,例如rxbinding的存在意義是什么审编。

他們的意義是撼班,把平常我們?cè)诎沧块_(kāi)發(fā)接觸過(guò)程中的一些組件,以RxJava概念里面的流(Stream)呈現(xiàn)出來(lái)垒酬。就像大部分文章里面提到的砰嘁,在Rx的世界里面件炉,everything is stream“妫或者更詳細(xì)的說(shuō)斟冕,everything is event stream。這也呼應(yīng)了Rx的event-driven的本質(zhì)板祝。

這里的stream宫静,流,和我們?cè)趈ava api里面的stream理解稍微不太一樣券时。Rx里面的流,可以理解為一個(gè)事件的流伏伯,這個(gè)流可以是從一個(gè)List里面提取的橘洞,擁有有限個(gè)元素的流,或者是一個(gè)網(wǎng)絡(luò)請(qǐng)求的流说搅,有限個(gè)元素炸枣,但是你不知道它從一個(gè)元素的發(fā)射到下一個(gè)元素的發(fā)射需要多久(網(wǎng)絡(luò)請(qǐng)求時(shí)間),又或者是像點(diǎn)擊事件這種弄唧,擁有無(wú)限個(gè)元素适肠,發(fā)射間隔完全取決于用戶。

這就是為什么RxJava在他們的wiki page里面候引,每一個(gè)operator都配上了一個(gè)侯养,一條直線,一個(gè)箭頭澄干,直線上有若干元素的圖了逛揩。

箭頭往前走,時(shí)間往前走

時(shí)間朝著箭頭的方向走麸俘,事件也有序的一個(gè)個(gè)發(fā)射辩稽。

變成流之后,我們就可以用各種操作符把原始的流从媚,改變成我們需要的流了逞泄,每一次我們使用一個(gè)操作符比如filter, map等拜效,我們其實(shí)已經(jīng)把原始的流改變成一個(gè)新的流了喷众。

這是我個(gè)人關(guān)于Rx里面的流的一點(diǎn)思考,希望對(duì)大家有幫助拂檩。


最后

最近工作有點(diǎn)忙侮腹,關(guān)于RxJava的文章會(huì)在兩周之后更新。我會(huì)著重講解一下RxJava的一些源代碼稻励。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末父阻,一起剝皮案震驚了整個(gè)濱河市愈涩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌加矛,老刑警劉巖履婉,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斟览,居然都是意外死亡毁腿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)苛茂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)已烤,“玉大人,你說(shuō)我怎么就攤上這事妓羊】杈浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵躁绸,是天一觀的道長(zhǎng)裕循。 經(jīng)常有香客問(wèn)我,道長(zhǎng)净刮,這世上最難降的妖魔是什么剥哑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮淹父,結(jié)果婚禮上株婴,老公的妹妹穿的比我還像新娘。我一直安慰自己弹灭,他們只是感情好督暂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著穷吮,像睡著了一般逻翁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捡鱼,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天八回,我揣著相機(jī)與錄音,去河邊找鬼驾诈。 笑死缠诅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乍迄。 我是一名探鬼主播管引,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼闯两!你這毒婦竟也來(lái)了褥伴?” 一聲冷哼從身側(cè)響起谅将,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎重慢,沒(méi)想到半個(gè)月后饥臂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡似踱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年隅熙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片核芽。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囚戚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狞洋,到底是詐尸還是另有隱情弯淘,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布吉懊,位于F島的核電站,受9級(jí)特大地震影響假勿,放射性物質(zhì)發(fā)生泄漏借嗽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一转培、第九天 我趴在偏房一處隱蔽的房頂上張望恶导。 院中可真熱鬧,春花似錦浸须、人聲如沸惨寿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裂垦。三九已至,卻和暖如春肌索,著一層夾襖步出監(jiān)牢的瞬間蕉拢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工诚亚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晕换,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓站宗,卻偏偏與公主長(zhǎng)得像闸准,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梢灭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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