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事件作出響應");
}
});