RxJAVA初探

參考博主 扔物線給 Android 開發(fā)者的 RxJava 詳解,可點擊學習脐瑰。

原文鏈接:RxJAVA

github鏈接:

GitHub - ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

GitHub - ReactiveX/RxAndroid: RxJava bindings for Android

gradle依賴:

compile 'io.reactivex:rxjava:1.0.14'

compile 'io.reactivex:rxandroid:1.0.1'

注:此鏈接和依賴從RxJAVA - 簡書?中獲取谒撼,如不可用鱼鼓,請查看博客原文。

一.RxJAVA的定義:

RxJava 在 GitHub 主頁上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個在 Java VM 上使用可觀測的序列來組成異步的乍狐、基于事件的程序的庫)弄企。

原文鏈接:RxJAVA - 簡書

二.API 介紹和原理簡析:

1. 概念:擴展的觀察者模式

RxJava 的異步實現(xiàn)超燃,是通過一種擴展的觀察者模式來實現(xiàn)的。

四個關(guān)鍵詞:被觀察者(observable)拘领,觀察者(observer)淋纲,訂閱(subscribe),事件院究;

回調(diào)事件,除onNext()之外的兩個特殊事件:

onCompleted():事件隊列完結(jié)本涕。把每個事件單獨分開业汰,并以隊列的形式處理;

onError():事件隊列異常菩颖。在事件處理過程中出異常時样漆,onError()會被觸發(fā),同時隊列自動終止晦闰,不允許再有事件發(fā)出放祟。

RxJAVA觀察者模式如下圖:

2.基本實現(xiàn):

1).創(chuàng)建觀察者Observer,它決定觸發(fā)事件后的行為呻右;

2).創(chuàng)建被觀察者Observable跪妥,它決定觸發(fā)什么事件以及觸發(fā)怎樣的事件;在回調(diào)方法中声滥,調(diào)用Observer對象的回調(diào)方法眉撵,進行事件的傳遞,這就是觀察者模式落塑;

create()方法是 RxJava 最基本的創(chuàng)造事件序列的方法纽疟,just(T...): 將傳入的參數(shù)依次發(fā)送出來:

Observable observable=Observable.just("Hello","Hi","Aloha");// 將會依次調(diào)用:// onNext("Hello");// onNext("Hi");// onNext("Aloha");// onCompleted();

from(T[])/from(Iterable): 將傳入的數(shù)組或Iterable拆分成具體對象后,依次發(fā)送出來憾赁。

String[]words={"Hello","Hi","Aloha"};

Observable observable=Observable.from(words);// 將會依次調(diào)用:// onNext("Hello");// onNext("Hi");// onNext("Aloha");// onCompleted();

原文鏈接:給 Android 開發(fā)者的 RxJava 詳解

3)Subscribe訂閱

observable.subscribe(observer);//observable.subscribe(subscriber);

3.線程控制污朽,Scheduler(一)

在不指定線程的情況下,RxJAVA遵循的是線程不變的原則龙考,如果需要切換線程蟆肆,就需要用到Scheduler(調(diào)度器)矾睦;

1)Scheduler的API

Schedulers.immediate()//直接在當前線程運行,相當于不指定線程颓芭。這是默認的Scheduler顷锰;

Schedulers.newThread()// 總是啟用新線程,并在新線程執(zhí)行操作亡问;

Schedulers.io(): I/O 操作(讀寫文件官紫、讀寫數(shù)據(jù)庫、網(wǎng)絡(luò)信息交互等)所使用的Scheduler州藕。行為模式和newThread()差不多束世,區(qū)別在于io()的內(nèi)部實現(xiàn)是是用一個無數(shù)量上限的線程池,可以重用空閑的線程床玻,因此多數(shù)情況下io()比newThread()更有效率毁涉。不要把計算工作放在io()中,可以避免創(chuàng)建不必要的線程锈死;

Schedulers.computation(): 計算所使用的Scheduler贫堰。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作待牵,例如圖形的計算其屏。這個Scheduler使用的固定的線程池,大小為 CPU 核數(shù)缨该。不要把 I/O 操作放在computation()中偎行,否則 I/O 操作的等待時間會浪費 CPU;

另外贰拿, Android 還有一個專用的AndroidSchedulers.mainThread()蛤袒,它指定的操作將在 Android 主線程運行;

有了這幾個Scheduler膨更,就可以使用subscribeOn()和observeOn()兩個方法來對線程進行控制了妙真。 *subscribeOn(): 指定subscribe()所發(fā)生的線程,即Observable.OnSubscribe被激活時所處的線程荚守∫酰或者叫做事件產(chǎn)生的線程。 *observeOn(): 指定Subscriber所運行在的線程健蕊×庹螅或者叫做事件消費的線程。

4.變換

1)概念:所謂變換缩功,就是將事件序列中的對象或整個序列進行加工處理晴及,轉(zhuǎn)換成不同的事件或事件序列;

2)map(): 事件對象的直接變換嫡锌,一對一的轉(zhuǎn)換

3)如果需要一對多的轉(zhuǎn)換虑稼,就需要用到flatMap();

4)變換的原理lift()

5.線程控制琳钉,Scheduler(二)

多次調(diào)用subscribeOn(),只有第一次起作用蛛倦;

更多內(nèi)容請參照原文 給 Android 開發(fā)者的 RxJava 詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歌懒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子溯壶,更是在濱河造成了極大的恐慌及皂,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件且改,死亡現(xiàn)場離奇詭異验烧,居然都是意外死亡,警方通過查閱死者的電腦和手機又跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門碍拆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慨蓝,你說我怎么就攤上這事感混。” “怎么了礼烈?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵浩习,是天一觀的道長。 經(jīng)常有香客問我济丘,道長,這世上最難降的妖魔是什么洽蛀? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任摹迷,我火速辦了婚禮,結(jié)果婚禮上郊供,老公的妹妹穿的比我還像新娘峡碉。我一直安慰自己,他們只是感情好驮审,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布鲫寄。 她就那樣靜靜地躺著,像睡著了一般疯淫。 火紅的嫁衣襯著肌膚如雪地来。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天熙掺,我揣著相機與錄音未斑,去河邊找鬼。 笑死币绩,一個胖子當著我的面吹牛蜡秽,可吹牛的內(nèi)容都是我干的府阀。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼芽突,長吁一口氣:“原來是場噩夢啊……” “哼试浙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寞蚌,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤田巴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睬澡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體固额,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年煞聪,在試婚紗的時候發(fā)現(xiàn)自己被綠了斗躏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡昔脯,死狀恐怖啄糙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情云稚,我是刑警寧澤隧饼,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站静陈,受9級特大地震影響燕雁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲸拥,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一拐格、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刑赶,春花似錦捏浊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至牵敷,卻和暖如春胡岔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枷餐。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工姐军, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓奕锌,卻偏偏與公主長得像著觉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惊暴,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

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