最通俗易懂的教你使用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对同一状态改变只会响应一次。

相关链接如下:

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