概述
根據RxJava 在 GitHub 的介紹:
RxJava:a library for composing asynchronous and event-based programs using observable sequences for the Java VM
// 翻譯:RxJava 是一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫
RxJava 是一個 基於事件流、實現異步操作的庫,是一種基於觀察者模式的響應式編程框架
RxJava的特點就是可以非常簡便的實現異步調用,類似於Android中的 AsyncTask 、Handler作用;
同時由於 RxJava的使用方式是:基於事件流的鏈式調用,所以使得 RxJava:
- 邏輯簡潔
- 實現優雅
- 使用簡單
更重要的是,隨着程序邏輯的複雜性提高,它依然能夠保持簡潔 & 優雅
Rxjava原理介紹
Rxjava 基於 一種擴展的觀察者模式
在RxJava中主要有4個角色:
- 被觀察者(Observable)------產生事件
- 訂閱(Subscribe)----連接 被觀察者 & 觀察者
- 觀察者(Observer) -----接收事件,並給出響應動作
- 事件(Event) ------被觀察者 & 觀察者 溝通的載體
RxJava原理可總結爲:被觀察者 (Observable) 通過 訂閱(Subscribe) 按順序發送事件 給觀察者 (Observer), 觀察者(Observer) 按順序接收事件 & 作出對應的響應動作
原理分析:
一般我們使用RxJava都是編寫類似如下的代碼
Observable.create(new ObservableOnSubscribe()) //創建一個事件流,參數是我們創建的一個事件源
.map(...)//有時我們會需要使用操作符進行變換
.subscribeOn(Schedulers.io())//指定事件源代碼執行的線程
.observeOn(AndroidSchedulers.mainThread())//指定訂閱者代碼執行的線程
.subscribe(new Observer())//參數是我們創建的一個訂閱者,在這裏與事件流建立訂閱關係
Observable 是RxJava描述的事件流,在鏈式調用中非常清晰,事件從創建到加工處理再到被訂閱者接收到,就是一個接一個的Observable形成的一個事件流。在上面代碼中,每一步方法的調用,都會返回一個新的Observable給下一步,這個是RxJava源碼的基礎。同樣是鏈式調用,但它與常見的Builder模式不太一樣,每個操作符,每次線程切換,每步都會新建一個Observable而非直接加工上一步的Observable返回給下一步。(在源碼中不同的加工會創建不同的Observable,比如map()會創建一個ObservableMap,subscribeOn()會創建一個ObservableSubscribeOn,但它們實際上都是Observable的子類)。
ObservableOnSubscribe 是這個事件流的源頭,稱之爲事件源,一般由自己創建並傳入。創建時,需要重寫其subscribe()方法,爲了和Observable中的subscribe()方法區別,在下面貼出的代碼中將其改名爲call()。在調用鏈中有時會用到各種操作符進行一些變換,事實上每個操作符都會重寫這麼一個call()方法,相對於創建事件源時在這裏寫入的源業務代碼,這些操作符在這裏要做的事是由RxJava欽定的,一般是連接事件流的上下游。在這裏將準備好被訂閱的數據,並調用subscribe()參數中ObservableEmitter的onNext(),onCompleted()或onError()通知訂閱者數據準備情況。
Observer 是整個事件流的訂閱者,也就是說,它將會訂閱前面事件創建,加工以後的最終結果。它也是由我們創建的,並且要重寫它的onNext(),onCompleted(),onError()和onSubscribe(),在接下來的分析中簡化一些,只關注onNext()。創建出了Observer以後,將會使用經過上面所有步驟的最後一步生成的Observable,調用它的subscribe(),與事件源產生聯繫。
使用步驟
-
創建被觀察者 (Observable )
-
創建觀察者 (Observer )並 定義響應事件的行爲
Subscribe方法用於將觀察者連接到Observable,你的觀察者需要實現以下方法的一個子集:- onNext(T item)
Observable調用這個方法發射數據,方法的參數就是Observable發射的數據,這個方法可能會被調用多次,取決於你的實現。 - onError(Exception ex)
當Observable遇到錯誤或者無法返回期望的數據時會調用這個方法,這個調用會終止Observable,後續不會再調用onNext和onCompleted,onError方法的參數是拋出的異常。 - onComplete
正常終止,如果沒有遇到錯誤,Observable在最後一次調用onNext之後調用此方法。
根據Observable協議的定義,onNext可能會被調用零次或者很多次,最後會有一次onCompleted或onError調用(不會同時),傳遞數據給onNext通常被稱作發射,onCompleted和onError被稱作通知。
- onNext(T item)
-
訂閱(Subscribe)連接觀察者和被觀察者
Rxjava的基本實現
- 使用前先在Android Studio中配置gradle:
dependencies {
......
implementation "io.reactivex.rxjava2:rxjava:2.2.8"
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
}
其中Rxandroid是Rxjava在Android平臺的擴展,它包括了一些能夠簡化Android開發的工具;
- 創建一個被觀察者Observable:
//1. 創建一個Observable 可被觀察者
Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
//在訂閱觸發時發送了發送了兩條數據
if(!emitter.isDisposed()){
emitter.onNext("hello rxjava2");
emitter.onNext("小夥伴們,你們好");
}
emitter.onComplete();
}
});
- 創建一個觀察者Observer:
//2.創建一個觀察者
Observer<String> Observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.i("Eric","onSubscribe: " + d);
}
@Override
public void onNext(String d) {
Log.i("Eric","onNext: " + d);
}
@Override
public void onError(Throwable e) {
Log.i("Eric","onError: " + e.getMessage() );
}
@Override
public void onComplete() {
Log.i("Eric","onComplete: ");
}
};
- observer(觀察者) 訂閱 observable(被觀察者)
//observer(觀察者) 訂閱 observable(被觀察者)
observable.subscribe(Observer);
- 查看輸出
com.eric.rxjavademo I/Eric: onSubscribe: CreateEmitter{null}
com.eric.rxjavademo I/Eric: onNext: 發射一條消息:
com.eric.rxjavademo I/Eric: onNext: 你好!Rxjava
com.eric.rxjavademo I/Eric: onComplete: