介紹:
在GitHub主頁上的介紹:
a library for composing asynchronous and event-based programs using observable sequences for the Java VM
意思就是
一個在 Java VM 上使用可觀測的序列來組成異步的、基於事件的程序的庫
優點
隨着代碼變得越來越多越來越複雜,RxJava 依舊可以使邏輯代碼看起來很簡潔
什麼是觀察者模式
被觀察者:被觀察的對象,某個狀態發生改變時會通知觀察者
觀察者: 監視被觀察者的行爲,被觀察者有狀態變化的時候會通知觀察者,觀察者會執行相應的操作
訂閱: 用來將觀察者與被觀察者建立聯繫
舉個例子
觀察者相當於警察,被觀察者是小偷,警察通過監控器觀察小偷的行爲,發現他有偷東西的動作時會行動抓 他,通過監控器將他們兩個的行爲聯繫起來
RxJava
RxJava中的三個角色進行一下角色分配
觀察者:Observer;
被觀察者:Observable;
訂閱(或註冊):subscribe()。
觀察者
Observer即觀察者,它決定事件觸發的時候將有怎樣的行爲
RxJava Observer事件回調方法,除了onNext(),還有onCompleted(),onError();
onCompleted(): 事件隊列完結。RxJava 不僅把每個事件單獨處理,還會把它們看做一個隊列。RxJava 規定,當不會再有新的onNext()發出時,需要觸發onCompleted()方法作爲標誌。
onError(): 事件隊列異常。在事件處理過程中出異常時,onError()
會被觸發,同時隊列自動終止,不允許再有事件發出。
在一個正確運行的事件序列中,onCompleted()和onError()有且只有一個,並且是事件序列中的最後一個。需要注意的是,onCompleted()
和onError()二者也是互斥的,即在隊列中調用了其中一個,就不應該再調用另一個。
被觀察者
Observable即被觀察者,它決定事件什麼時候被觸發以及觸發時候將有怎樣的行爲可以使用create()、just(T…)、from(T[])來創建一個 Observable ,併爲它定義事件觸發規則。
訂閱
創建了Observable和Observer之後,再用subscribe()方法將它們聯結起來
使用
添加依賴
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
創建一個觀察者對象
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
Logger.d("onCompleted");
}
@Override
public void onError(Throwable e) {
Logger.d("onError");
}
@Override
public void onNext(String s) {
Logger.d("onNext");
}
};
創建一個被觀察者
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("World");
subscriber.onCompleted();
}
});
訂閱
observable.subscribe(observer);
Subscriber
除了Observer接口之外,RxJava 還內置了一個實現了Observer的抽象:Subscriber。Subscriber對Observer接口進行了一些擴展,但他們的基本使用方式是完全一樣的:
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Logger.d("onCompleted");
}
@Override
public void onError(Throwable e) {
Logger.d("onError");
}
@Override
public void onNext(String s) {
Logger.d("onNext");
}
@Override
public void onStart() {
super.onStart();
}
};
所以如果你只想使用基本功能,選擇Observer和Subscriber是完全一樣的。它們的區別對於使用者來說主要有兩點:
onStart(): 這是Subscriber增加的方法。它會在 subscribe 剛開始,而事件還未發送之前被調用,可以用於做一些準備工作,例如數據的清零或重置。這是一個可選方法,默認情況下它的實現爲空。需要注意的是,如果對準備工作的線程有要求(例如彈出一個顯示進度的對話框,這必須在主線程執行),onStart()就不適用了,因爲它總是在 subscribe 所發生的線程被調用,而不能指定線程。要在指定的線程來做準備工作,可以使用doOnSubscribe()方法,具體可以在後面的文中看到。
unsubscribe(): 這是Subscriber所實現的另一個接口Subscription
的方法,用於取消訂閱。在這個方法被調用後,Subscriber將不再接收事件。一般在這個方法調用前,可以使用isUnsubscribed()先判斷一下狀態。unsubscribe()這個方法很重要,因爲在subscribe()之後,Observable會持有Subscriber的引用,這個引用如果不能及時被釋放,將有內存泄露的風險。所以最好保持一個原則:要在不再使用的時候儘快在合適的地方(例如onPause()onStop()等方法中)調用unsubscribe()來解除引用關係,以避免內存泄露的發生。
Observable其他幾種創建方式
1、使用Observable.just()創建被觀察者
Observable observable = Observable.just("Hello", "World");
2、使用Observable.from()創建被觀察者
String[] words = {"Hello", "World"};
Observable observable1 = Observable.from(words);
或者
List<String> list = new ArrayList<String>();
list.add("Hellow");
list.add("Wrold");
Observable observable4 = Observable.from(list);