Rxjava 初步學(xué)習(xí)使用

一.原理學(xué)習(xí)

核心:觀察者模式

觀察者模式:A 對象(觀察者)對 B 對象(被觀察者)的某種變化高度敏感捺疼,需要在 B 變化的一瞬間做出反應(yīng)婚被。

注意:觀察者不需要時刻盯著被觀察者(例如 A 不需要每過 2ms 就檢查一次 B 的狀態(tài))公你,而是采用注冊(Register)或者稱為訂閱(Subscribe)的方式慌植,告訴被觀察者:我需要你的某某狀態(tài)休雌,你要在它變化的時候通知我灶壶。

舉例說明:Android開發(fā)中一個比較典型的例子是點擊監(jiān)聽器OnClickListener。對設(shè)置OnClickListener來說挑辆,View是被觀察者例朱,OnClickListener是觀察者,二者通過setOnClickListener()方法達成訂閱關(guān)系鱼蝉。訂閱之后用戶點擊按鈕的瞬間洒嗤,Android Framework 就會將點擊事件發(fā)送給已經(jīng)注冊的?OnClickListener?。采取這樣被動的觀察方式魁亦,既省去了反復(fù)檢索狀態(tài)的資源消耗渔隶,也能夠得到最高的反饋速度。

簡單理解就是:A(觀察者) ==》B(被觀察者)? 注冊訂閱關(guān)系

當(dāng)B發(fā)生變化的時候會通知A洁奈,A做出相應(yīng)的操作间唉。


針對監(jiān)聽器OnClickListener的例子展開說明:

如圖所示,通過setOnClickListener()方法利术,Button持有OnClickListener的引用呈野;當(dāng)用戶點擊時,Button自動調(diào)用OnClickListener的onClick()方法印叁。另外被冒,如果把這張圖中的概念抽象出來(Button?->被觀察者军掂、OnClickListener?->觀察者、setOnClickListener()?->訂閱昨悼,onClick()?->事件)

圖-1.1

變成下面通用的觀察者模式

圖-1.2


RxJava的觀察者模式

RxJava有四個基本概念:Observable?(可觀察者蝗锥,即被觀察者)、Observer?(觀察者)率触、subscribe?(訂閱)终议、事件。Observable和Observer通過subscribe()方法實現(xiàn)訂閱關(guān)系葱蝗,從而Observable可以在需要的時候發(fā)出事件來通知Observer穴张。

RxJava的事件回調(diào)方法除了普通事件onNext()(相當(dāng)于onClick()?/?onEvent())之外,還定義了兩個特殊的事件:onCompleted()和onError()垒玲。

onCompleted():事件隊列完結(jié)陆馁。RxJava不僅把每個事件單獨處理,還會把它們看做一個隊列合愈。RxJava規(guī)定叮贩,當(dāng)不會再有新的onNext()發(fā)出時,需要觸發(fā)onCompleted()方法作為標(biāo)志佛析。

onError(): 事件隊列異常益老。在事件處理過程中出異常時,onError()?會被觸發(fā)寸莫,同時隊列自動終止捺萌,不允許再有事件發(fā)出。

在一個正確運行的事件序列中,?onCompleted()?和?onError()?有且只有一個膘茎,并且是事件序列中的最后一個桃纯。需要注意的是,onCompleted()?和?onError()?二者也是互斥的披坏,即在隊列中調(diào)用了其中一個态坦,就不應(yīng)該再調(diào)用另一個。

RxJava 的觀察者模式大致如下圖

圖-1.3


二.例子展示

1.添加依賴

compile 'io.reactivex:rxjava:1.0.14'?

compile 'io.reactivex:rxandroid:1.0.1'

圖-2.1

2.創(chuàng)建觀察者

圖-2.2

3.創(chuàng)建被觀察者

圖-2.3

4.實現(xiàn)訂閱關(guān)系

圖-2.4

預(yù)期結(jié)果:當(dāng)點擊控件時棒拂,會依次調(diào)用三次?onNext()?和一次?onCompleted()伞梯。

實際結(jié)果:

圖-2.5

這個例子很簡單:事件的內(nèi)容是字符串,而不是一些復(fù)雜的對象帚屉,簡單的學(xué)會的谜诫,復(fù)雜的自己可以去探索,根據(jù)需求場景擴展攻旦。

三.擴展

1.除了?Observer?接口之外喻旷,RxJava 還內(nèi)置了一個實現(xiàn)了?Observer?的抽象類:Subscriber。?Subscriber?對?Observer?接口進行了一些擴展牢屋,但他們的基本使用方式是完全一樣的:

圖-3.1

實質(zhì)上掰邢,在 RxJava 的 subscribe 過程中牺陶,Observer?也總是會先被轉(zhuǎn)換成一個?Subscriber?再使用。它們的區(qū)別對于使用者來說主要有兩點:

1)onStart(): 這是?Subscriber?增加的方法辣之。它會在 subscribe 剛開始,而事件還未發(fā)送之前被調(diào)用皱炉,可以用于做一些準(zhǔn)備工作怀估,例如數(shù)據(jù)的清零或重置。這是一個可選方法合搅,默認(rèn)情況下它的實現(xiàn)為空多搀。需要注意的是,如果對準(zhǔn)備工作的線程有要求(例如彈出一個顯示進度的對話框灾部,這必須在主線程執(zhí)行)康铭,?onStart()?就不適用了,因為它總是在 subscribe 所發(fā)生的線程被調(diào)用赌髓,而不能指定線程从藤。要在指定的線程來做準(zhǔn)備工作,可以使用?doOnSubscribe()?方法锁蠕,具體可以在后面的文中看到夷野。

2)unsubscribe(): 這是?Subscriber?所實現(xiàn)的另一個接口?Subscription?的方法,用于取消訂閱荣倾。在這個方法被調(diào)用后悯搔,Subscriber?將不再接收事件。一般在這個方法調(diào)用前舌仍,可以使用?isUnsubscribed()?先判斷一下狀態(tài)妒貌。?unsubscribe()?這個方法很重要,因為在?subscribe()?之后铸豁,?Observable?會持有?Subscriber?的引用灌曙,這個引用如果不能及時被釋放,將有內(nèi)存泄露的風(fēng)險推姻。所以最好保持一個原則:要在不再使用的時候盡快在合適的地方(例如?onPause()?onStop()?等方法中)調(diào)用?unsubscribe()?來解除引用關(guān)系平匈,以避免內(nèi)存泄露的發(fā)生。

2.RxJava 還提供了一些方法用來快捷創(chuàng)建事件隊列藏古,都和 create(OnSubscribe)?的例子是等價的增炭。

just(T...): 將傳入的參數(shù)依次發(fā)送出來。

from(T[])?/?from(Iterable<? extends T>)?: 將傳入的數(shù)組或?Iterable?拆分成具體對象后拧晕,依次發(fā)送出來隙姿。

圖-3.2

今天暫時學(xué)習(xí)到這里,下次繼續(xù)厂捞!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末输玷,一起剝皮案震驚了整個濱河市队丝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欲鹏,老刑警劉巖机久,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赔嚎,居然都是意外死亡膘盖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門尤误,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侠畔,“玉大人,你說我怎么就攤上這事损晤∪砉祝” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵尤勋,是天一觀的道長喘落。 經(jīng)常有香客問我,道長斥黑,這世上最難降的妖魔是什么揖盘? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锌奴,結(jié)果婚禮上兽狭,老公的妹妹穿的比我還像新娘。我一直安慰自己鹿蜀,他們只是感情好箕慧,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茴恰,像睡著了一般颠焦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上往枣,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天伐庭,我揣著相機與錄音,去河邊找鬼分冈。 笑死圾另,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雕沉。 我是一名探鬼主播集乔,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坡椒!你這毒婦竟也來了扰路?” 一聲冷哼從身側(cè)響起尤溜,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汗唱,沒想到半個月后宫莱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡哩罪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年梢睛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识椰。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖深碱,靈堂內(nèi)的尸體忽然破棺而出腹鹉,到底是詐尸還是另有隱情,我是刑警寧澤敷硅,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布功咒,位于F島的核電站,受9級特大地震影響绞蹦,放射性物質(zhì)發(fā)生泄漏力奋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一幽七、第九天 我趴在偏房一處隱蔽的房頂上張望景殷。 院中可真熱鬧,春花似錦澡屡、人聲如沸猿挚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绩蜻。三九已至,卻和暖如春室埋,著一層夾襖步出監(jiān)牢的瞬間办绝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工姚淆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孕蝉,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓肉盹,卻偏偏與公主長得像昔驱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子上忍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 我從去年開始使用 RxJava 骤肛,到現(xiàn)在一年多了纳本。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,468評論 7 62
  • 最近項目里面有用到Rxjava框架,感覺很強大的巨作淑玫,所以在網(wǎng)上搜了很多相關(guān)文章巾腕,發(fā)現(xiàn)一片文章很不錯,今天把這篇文...
    Scus閱讀 6,878評論 2 50
  • 轉(zhuǎn)一篇文章 原地址:http://gank.io/post/560e15be2dca930e00da1083 前言...
    jack_hong閱讀 915評論 0 2
  • 【金偉早安問候】Day 6[愛心] 當(dāng)你想堅持一件事情佛寿,而又感覺很難的時候,不妨從一個微習(xí)慣開始但壮。 我曾經(jīng)以為今...
    金偉的心靈花園閱讀 266評論 0 0
  • 跳跳糖 刺激了沉默的舌頭 我禁不住要說正直的話 我喜歡糖果創(chuàng)造的快樂 你送我跳跳糖 頑皮的童年又回來了 我們開始爆...
    倩何人換取閱讀 176評論 0 0