Rxjava中的Observer和Observable使用
響應式編程庫RxJava的主要應用場景是異步。
RxJava中的Observer和Observable是兩個重要的類或接口。下面我們進行一個簡單測試。
(1)首先創建一個Observable的實例。
- 創建方法有很多,如create(),defer(),just(),from(),rang(),timer(),interval()等方式。這裏使用最常用的create,它的參數是一個ObservableOnSubscribe實例。
- 此時會回調ObservableOnSubscribe#subscribe( ObservableEmitter emitter)。subscribe(ObservableEmitter emitter)會在Observable被訂閱時進行響應回調,它的響應在Observer#onSubscribe(Disposable d)方法之後。
private ObservableEmitter<String> mEmitter;
private Observable<String> mObservable;
private void createObservable() {
mObservable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) {
Log.i(TAG, " Observable has create");
mEmitter = emitter;
}
});
}
調用createObservable()方法subscribe(ObservableEmitter emitter)並不會響應。
(2)實例化一個Observer對象
Observer的四個方法的詳細講解請看Observer
private Observer<String> mObserver = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
Log.i(TAG, " +++ onSubscribe");
if (d != null) {
System.out.println(" d.hashCode()=" + d.hashCode() + " mEmitter.hashCode() " + mEmitter.hashCode());
System.out.println(" d.getClass()=" + d.getClass().getCanonicalName());
}
}
@Override
public void onNext(String s) {
Log.i(TAG, " +++ onNext" + s);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, " +++ onError");
}
@Override
public void onComplete() {
Log.i(TAG, " +++ onComplete");
}
};
(3)Observable進行訂閱
mObservable.subscribe(mObserver);
需要注意的是多次訂閱subscribe(mObserver),你仔細查看會發現
public void onSubscribe(Disposable d) {
Log.i(TAG, " +++ onSubscribe");
if (d != null) {
System.out.println(" d.hashCode()=" + d.hashCode() + " mEmitter.hashCode() " + mEmitter.hashCode());
System.out.println(" d.getClass()=" + d.getClass().getCanonicalName());
}
}
- observer.onSubscribe方法在 Observable.subscribe之前調用
I: +++ onSubscribe
I: d.hashCode()=464508421
I: d.getClass()=io.reactivex.internal.operators.observable.ObservableCreate.CreateEmitter
I: Observable has create
- d.getClass()=io.reactivex.internal.operators.observable.ObservableCreate.CreateEmitter可知 onSubscribe(Disposable d)中的d 是一個Emitter類
- 通過多次調用mObservable.subscribe(mObserver),查看打印結果如下:
I/System.out: d.hashCode()=464508421
I/System.out: mEmitter.hashCode() 464508421
I/System.out: d.hashCode()=703714906
I/System.out: mEmitter.hashCode() 703714906
I/System.out: d.hashCode()=786686091
I/System.out: mEmitter.hashCode() 786686091
每調用一次mObservable.subscribe(mObserver),都會有一個新的Emitter和Disposable 的實現子類 ( Disposable d 和 ObservableEmitter emitter 的hashCode是一模一樣的)。
說明Observable.subscribe()每次會創建一個新的 ObservableEmitter。
(4)被觀察者改變狀態
Observable的狀態改變後,數據是由ObservableEmitter通過onNext、onComplete、onError方法發射的,訂閱了的Observer會響應對應的onNext、onComplete、onError方法。如執行方法:
mEmitter.onNext("Hello");
mEmitter.onComplete();
方法的響應順序爲
ObservableEmitter.onNext
Observer.onNext
ObservableEmitter.onComplete
Observer.onComplete
且此時發現mEmitter.hashCode是不會改變的
如果進行多次的mEmitter.onNext("Hello"); mEmitter.onComplete();
操作,
只會有ObservableEmitter.onNext 、 ObservableEmitter.onComplete
兩方法響應。
Observer.onNext 、 Observer.onComplete
是不會響應的。這就驗證了。Observer對同一狀態改變只會響應一次。
相關鏈接如下: