建立订阅关系调用了Observable
的subscribe
方法。
public final void subscribe(Observer<? super T> observer) {
ObjectHelper.requireNonNull(observer, “observer is null”);
try {
observer = RxJavaPlugins.onSubscribe(this, observer);
ObjectHelper.requireNonNull(observer, “The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins”);
subscribeActual(observer);
} catch (NullPointerException e) { // NOPMD
…
} catch (Throwable e) {
…
}
}
方法中还是先判断了传入参数observer
是否为空,接着还是一个Hook
实现,这里就不细究了,获得Hook
返回的observer
后再次判断是否为空,之后调用了subscribeActual
方法。
protected abstract void subscribeActual(Observer<? super T> observer);
Observable
的subscribeActual
方法是个抽象方法,之前看过这里的Observable
实际实现是个ObservableCreate
对象,所以再进入ObservableCreate
类查看对应方法。
@Override
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter parent = new CreateEmitter(observer);
observer.onSubscribe(parent);
try {
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
ObservableCreate
中的subscribeActual
方法中先创建了一个CreateEmitter
发射器对象,并将observer
对象传入。接着调用了observer
的onSubscribe
方法,此时观察者的onSubscribe
方法执行。最后调用了source
的subscribe
方法。
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
Log.d(getClass().getName(), Thread.currentThread().getName() + " ObservableOnSubscribe subscribe");
emitter.onNext(“string1”);
emitter.onNext(“string2”);
emitter.onNext(“string3”);
emitter.onComplete();
}
});
这个source
就是在create
方法中传入的ObservableOnSubscribe
。它的subscribe
方法中通过调用ObservableEmitter
的方法发送事件,这里的ObservableEmitter
就是之前创建的CreateEmitter
对象,所以再来进一步看看它其中的方法。
CreateEmitter(Observer<? super T> observer) {
this.observer = observer;
}
@Override
public void onNext(T t) {
if (t == null) {
onError(new NullPointerException(“onNext called with null. Null values are generally not allowed in 2.x operators and sources.”));
return;
}
if (!isDisposed()) {
observer.onNext(t);
}
}
@Override
public void onComplete() {
if (!isDisposed()) {
try {
observer.onComplete();
} finally {
dispose();
}
}
}
CreateEmitter
的构造函数接收了观察者对象,然后在调用onNext
方法时先做了空判断,再对isDisposed
进行取消订阅的判断,之后调用了observer
的onNext
方法,也就是观察者的onNext
方法。同样的onComplete
中最终也是调用了observer
的onComplete
方法。至此RxJava
中的基本订阅流程的源码就梳理完了。
4. 线程切换
RxJava
中有个很重要的功能,就是能方便的切换线程,来看下它的使用,还是之前基础使用中的例子进行修改。
Observable observable0 = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
Log.d(getClass().getName(), Thread.currentThread().getName() + " ObservableOnSubscribe subscribe");
emitter.onNext(“string1”);
emitter.onNext(“string2”);
emitter.onNext(“string3”);
emitter.onComplete();
}
});
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.d(getClass().getName(), Thread.currentThread().getName() + " onSubscribe");
}
@Override
public void onNext(String s) {
Log.d(getClass().getName(), Thread.currentThread().getName() + " onNext "+s);
}
@Override
public void onError(Throwable e) {
Log.d(getClass().getName(), Thread.currentThread().getName() + " onError");
}
@Override
public void onComplete() {