最通俗易懂的教你使用RxJava3(二)

Rxjava中的Observer和Observable使用


響應式編程庫RxJava的主要應用場景是異步。
RxJava中的ObserverObservable是兩個重要的類或接口。下面我們進行一個簡單測試。

(1)首先創建一個Observable的實例。

  1. 創建方法有很多,如create(),defer(),just(),from(),rang(),timer(),interval()等方式。這裏使用最常用的create,它的參數是一個ObservableOnSubscribe實例。
  2. 此時會回調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());
            }
        }
  1. observer.onSubscribe方法在 Observable.subscribe之前調用

I: +++ onSubscribe
I: d.hashCode()=464508421
I: d.getClass()=io.reactivex.internal.operators.observable.ObservableCreate.CreateEmitter
I: Observable has create

  1. d.getClass()=io.reactivex.internal.operators.observable.ObservableCreate.CreateEmitter可知 onSubscribe(Disposable d)中的d 是一個Emitter類
  2. 通過多次調用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對同一狀態改變只會響應一次。

相關鏈接如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章