RXJava入門總結以及簡易Demo
阿新 • • 發佈:2019-01-25
Rxjava由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎
在android開發框架中:RxJava+Retrofit+MVP+Dagger2(主流框架)中Rxjava是對網路連線處理和圖片載入處理非常好用的非同步操作方法,類似於Android中的AysncTask、Handler
Rxjava的模式類似於Java的觀察者模式
被觀察者:Observable
觀察者:Observer
通過訂閱來關聯觀察者和被觀察者:Subscribe
然後我覺得比較重要線上程切換方面的兩個方法的區別:
ObserveOn
指定一個觀察者在哪個排程器上觀察這個Observable
SubscribeOn
指定Observable自身在哪個排程器上執行
補充:對事件匯流排有理解的的,還可以去檢視一下RxBus來看一下Rxjava的事件匯流排處理機制
下面通過一個demo來簡易介紹Rxjava怎麼使用:
開發的IDE是android studio ,如果你是eclipse請點右上角的X
build.grade(app)中新增依賴:
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
第一個Demo是將被觀察者和觀察者和訂閱都分開寫。
建立被觀察者:
Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(1); e.onNext(2); e.onNext(3); e.onNext(4);//要傳送的事件 } });//建立被觀察者
建立觀察者
Observer<Integer> observer = new Observer<Integer>() {
private Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "開始採用subscribe連線");
mDisposable = d;
}
@Override
public void onNext(Integer value) {
Log.d(TAG, "對Next事件" + value + "作出相應");
if(value == 2){
mDisposable.dispose();
Log.d(TAG,"已經斷開連線:"+mDisposable.isDisposed());
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "對Error事件作出響應");
}
@Override
public void onComplete() {
Log.d(TAG, "對Complete事件作出響應");
}
};
補充:程式碼中有一行這個程式碼解釋一下
private Disposable mDisposable;
這個程式碼是訂閱者和被訂閱者的關係斷開的一個控制變數。
取消訂閱:
mDisposable.dispose();
取消訂閱後,觀察者就無法在接受被觀察者發來的資訊了將被觀察者和觀察者通過訂閱關係繫結
observable.subscribe(observer);
但是上面的程式碼,從字面上理解是被觀察者訂閱觀察者,從字面上理解有問題,其實從機制上來說沒問題,我個人的理解就是觀察者相當於一個接收器,而被觀察者是發起訊息的傳送器,傳送器來繫結一個接受器這樣的邏輯,如果不對,還請多多指教。
下面是Rxjava典型的鏈式結構:
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onNext(4);
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG,"開始採用subscribe連線");
}
@Override
public void onNext(Integer value) {
Log.d(TAG,"對Next事件"+value+"作出響應");
}
@Override
public void onError(Throwable e) {
Log.d(TAG,"對ERROR事件作出響應");
}
@Override
public void onComplete() {
Log.d(TAG,"對Complete事件作出響應");
}
});