網上大佬們都整理得很好了,只是老看,總覺得差點啥,所以,就想着自己再捋一遍,加深印象。
首先要知道Rxjava2是幹嘛得?特點是啥?爲啥要用它?
Github:https://github.com/ReactiveX/RxJava
官方解釋:
RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.
總結 :Rxjava是一個基於事件流、實現異步操作的庫。
作用:
實現異步操作,其作用效果和
Android
中Handler
、AsyncTask
類似。
特點:
Rxjava
的使用方式是: 基於事件流的鏈式調用,所以其特點:
- 邏輯簡潔
- 實現優雅
- 使用簡單
- 更重要的是,隨着程序邏輯複雜性提高,
Rxjava
依然能簡潔優雅。
核心思想:
Rxjava
其核心思想是 觀察者模式
例子1:A(連載小說) 可以看成被觀察者,B(讀者) 可以看成觀察者,其中B(讀者)訂閱了A(連載小說)後,一旦小說有更新就會推送給讀者,這樣B(讀者)就可以不用時時刻刻去盯着看A(連載小說)是否有更新,B(讀者)就可以花更多的事件去做其他事。
例子2:Android 中我們最常見的就是 Button
的點擊事件,此時Button
就是被觀察着,而OnClickListener()
可以看成觀察者,它們之間通過setOnClickListener()
完成訂閱關係,這樣,一旦Button
被點擊,就會觸發監聽,通知
OnClickListener()
// buton 被觀察着
Button button = findViewById(R.id.bt);
// setOnClickListener()方法實現二者訂閱關係
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 執行操作
}
});
在Rxjava中,
Observable
就是被觀察者,Observer
爲觀察者,它們之間通過subscribe
實現訂閱關係
正文
好了,前面說了一堆,現在可以擼起袖子開幹,先寫一個最簡單的Demo。
1、添加庫文件
implementation "io.reactivex.rxjava2:rxjava:2.2.2"
2、按照順序三部曲
(一)、初始化 Observable
(被觀察者)
Observable<String> observableString = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
Log.d(TAG, "Observable--subscribe: start");
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
LogUtil.d(TAG + "Observable--subscribe stop");
}
});
Observable<T>
通過 create()
方法創建,其中泛型爲操作對象,與 ObservableOnSubscribe<T>
中對象一致,
ObservableOnSubscribe
可以理解爲計劃表,重寫 subscribe(ObservableEmitter<T> emitter)
方法 ,可通過emitter
進行發送消息,其主要有三個方法:
- onNext(Object o)
- onComplete()
- onError(Throwable e)
三個方法分別對應了
Observer
(觀察者) 中的onNext()
、onComplete()
、onError()
注意點:
OnNext()
是可以多次調用的,onComplete()
和onError()
不能同時調用,會直接報錯。onComplete()
可多次調用,但是Observer
只接收其第一次,後面的不做處理。onError()
只可以調用一次,調用第二次直接報錯。
(二)、初始化 Observer
(觀察者)
Observer observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "Observer--onSubscribe: d=" + d.isDisposed());
}
@Override
public void onNext(String s) {
Log.d(TAG, "Observer--onNext: s=" + s);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "Observer--onError: ");
}
@Override
public void onComplete() {
Log.d(TAG, "Observer--onComplete: ");
}
};
通過New直接創建Observer
,實現其方法,其中 onNext()
、onComplete()
、onError()
三個方法與 Observable
中 一一對應,前面發送,這裏對應接收。
特別說一下 onSubscribe(Disposable d)
中的 Disposable
,它有 isDisposed()
和 dispose()
兩個方法,分別來判斷訂閱狀態及取消訂閱,此外這個方法,是最先進行調用的,等會後面會給出日誌。
(三)、訂閱
observableString.subscribe(observer);
按常理,應該是Observable
(觀察者)訂閱Observer
(被觀察者),但是Rxjava爲了滿足其鏈式調用,所以這裏給人感覺是被觀察者訂閱觀察者,這個不必在意,知道啥意思就行。
最後使用Rxjava的鏈式調用串起來:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
Log.d(TAG, "Observable--subscribe: start");
emitter.onNext("1");
emitter.onNext("2");
emitter.onNext("3");
emitter.onComplete();
LogUtil.d(TAG + "Observable--subscribe stop");
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "Observer--onSubscribe: d=" + d.isDisposed());
}
@Override
public void onNext(String s) {
Log.d(TAG, "Observer--onNext: s=" + s);
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "Observer--onError: ");
}
@Override
public void onComplete() {
Log.d(TAG, "Observer--onComplete: ");
}
});
上面就是一個最簡單的Rxjava的使用,日誌輸出 :