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对同一状态改变只会响应一次。
相关链接如下: