參考博主 扔物線 的給 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 詳解