參考博主 扔物線 的給 Android 開發者的 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 的異步實現,是通過一種擴展的觀察者模式來實現的。
四個關鍵詞:被觀察者(observable),觀察者(observer),訂閱(subscribe),事件;
回調事件,除onNext()之外的兩個特殊事件:
onCompleted():事件隊列完結。把每個事件單獨分開,并以隊列的形式處理;
onError():事件隊列異常。在事件處理過程中出異常時,onError()會被觸發,同時隊列自動終止,不允許再有事件發出。
RxJAVA觀察者模式如下圖:
2.基本實現:
1).創建觀察者Observer,它決定觸發事件后的行為;
2).創建被觀察者Observable,它決定觸發什么事件以及觸發怎樣的事件;在回調方法中,調用Observer對象的回調方法,進行事件的傳遞,這就是觀察者模式;
create()方法是 RxJava 最基本的創造事件序列的方法,just(T...): 將傳入的參數依次發送出來:
Observable observable=Observable.just("Hello","Hi","Aloha");// 將會依次調用:// onNext("Hello");// onNext("Hi");// onNext("Aloha");// onCompleted();
from(T[])/from(Iterable): 將傳入的數組或Iterable拆分成具體對象后,依次發送出來。
String[]words={"Hello","Hi","Aloha"};
Observable observable=Observable.from(words);// 將會依次調用:// onNext("Hello");// onNext("Hi");// onNext("Aloha");// onCompleted();
3)Subscribe訂閱
observable.subscribe(observer);//observable.subscribe(subscriber);
3.線程控制,Scheduler(一)
在不指定線程的情況下,RxJAVA遵循的是線程不變的原則,如果需要切換線程,就需要用到Scheduler(調度器);
1)Scheduler的API
Schedulers.immediate()//直接在當前線程運行,相當于不指定線程。這是默認的Scheduler;
Schedulers.newThread()// 總是啟用新線程,并在新線程執行操作;
Schedulers.io(): I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的Scheduler。行為模式和newThread()差不多,區別在于io()的內部實現是是用一個無數量上限的線程池,可以重用空閑的線程,因此多數情況下io()比newThread()更有效率。不要把計算工作放在io()中,可以避免創建不必要的線程;
Schedulers.computation(): 計算所使用的Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個Scheduler使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在computation()中,否則 I/O 操作的等待時間會浪費 CPU;
另外, Android 還有一個專用的AndroidSchedulers.mainThread(),它指定的操作將在 Android 主線程運行;
有了這幾個Scheduler,就可以使用subscribeOn()和observeOn()兩個方法來對線程進行控制了。 *subscribeOn(): 指定subscribe()所發生的線程,即Observable.OnSubscribe被激活時所處的線程。或者叫做事件產生的線程。 *observeOn(): 指定Subscriber所運行在的線程。或者叫做事件消費的線程。
4.變換
1)概念:所謂變換,就是將事件序列中的對象或整個序列進行加工處理,轉換成不同的事件或事件序列;
2)map(): 事件對象的直接變換,一對一的轉換
3)如果需要一對多的轉換,就需要用到flatMap();
4)變換的原理lift()
5.線程控制,Scheduler(二)
多次調用subscribeOn(),只有第一次起作用;
更多內容請參照原文 給 Android 開發者的 RxJava 詳解