GitHub上是這么說的:
一個(gè)在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫
本質(zhì)上做的就兩個(gè)字 : 異步. 剩下的定語: 可觀測序列,基于事件,響應(yīng)式,等等 全是用來修飾異步這個(gè)詞, 所以可以簡單地認(rèn)為他跟handler,AsyncTask一樣的做異步任務(wù)的東西;
本質(zhì)上還是就兩個(gè)字 線程切換方便,代碼邏輯清楚. 現(xiàn)在是不是想不明白它為啥這么牛是么,來,讓我用通俗的,人類可以明白的語言解釋一下.
線程切換方便 之前我們切換線程,是不是先寫一個(gè)Thread然后用handler來通訊,或者h(yuǎn)andler.post或者view.post.要寫老多代碼.然而在RxJava這兒,線程切換就兩行代碼: 
第一行上面的在子線程中運(yùn)行,第二行下面的在主線程中運(yùn)行. 怎么樣?爽不爽?!
代碼邏輯清楚
假設(shè)我們現(xiàn)在有這么一個(gè)需求:
Android設(shè)備上展示已安裝的第三方app列表
嗯,現(xiàn)在你的腦子里一定在思考應(yīng)該怎么辦,我個(gè)人的大致思路如下:
->調(diào)用系統(tǒng)api getapplicationInfoList() ->for循環(huán)過濾掉不是系統(tǒng)應(yīng)用 ->得到 ApplicationInfo (并無卵用,我們要的是AppInfo) ->for()循環(huán)得到 AppInfo -> 由于獲取ApplicationInfo、過濾數(shù)據(jù)、轉(zhuǎn)換數(shù)據(jù)相對比較耗時(shí)上面的方法哦子線程 ->線程切換到主線程中更新視圖
嗯,是不是感覺寫完之后全是循環(huán)套循環(huán),括號套括號,類似于這個(gè): 
不要在意內(nèi)容,只需要知道,會(huì)有辣么多的括號,for循環(huán)抱著for循環(huán),動(dòng)不動(dòng)還來個(gè)if啥的,可能現(xiàn)在你剛寫完你還能看懂,可是如果過了一個(gè)月你在看這些代碼,是不是就完全不知道到底寫了些什么? 蒙圈了吧!!! 哈哈
接下來就要請出RxJava了 ; 

有人說了,你這代碼明明是特么的變多了啊,哪兒來的簡潔了,大兄弟消消氣,代碼簡潔不一向是寫得少,而是閱讀起來方便.
這個(gè)RxJava的思路事實(shí)上是這樣的,先create出來一個(gè)ApplicationInfoList的list,然后用filter過濾掉非系統(tǒng)應(yīng)用,然后用map將ApplicationInfo轉(zhuǎn)換成為AppInfo,然后祭出線程切換的兩行神奇代碼,把上面的這些放到子線程中,然后后面在主線程中更新視圖.
完成,有的大兄弟還是蒙圈,沒事,你看咱們不看代碼 ,就看這幾個(gè)操作符(create,map,filter)啥的,里面的代碼不看,這樣的話代碼的邏輯是不是清楚了許多.
知道了他的定義和好處,接下來就要看他怎么寫了,首先聲明,接下來的代碼,大部分基于RxJava2,其實(shí)RxJava 1 2的用法差不多了;
因?yàn)槭腔谟^察者模式,所以必定會(huì)有觀察者和被觀察者,這里的觀察者可以叫做Publisher(發(fā)射源),被觀察者叫做(Observersable),流程呢,大致是這個(gè)樣子的:
為了形象生動(dòng)呢,接下來要利用你們的想象力,現(xiàn)在發(fā)射源是一個(gè) : 犯人,是的,就是監(jiān)獄里的犯人; 那么接收器就是 :是的你沒有猜錯(cuò),就是獄警. 現(xiàn)在犯人(Publisher)發(fā)了一個(gè)信號 : 我要越獄 . 然后這個(gè)信號開始傳播–>犯人路人甲(哦,你要越獄)–>犯人路人乙(手賤,過濾了一下(filter),變?yōu)?“我要”)–>犯人路人丙(鬼知道他做了什么,變?yōu)?“我要你” ##污##)–>獄警(WQNMLGB)接收到了信息,并且進(jìn)行了處理.
新聞熱點(diǎn)
疑難解答
圖片精選