这个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() {
Log.d(getClass().getName(), Thread.currentThread().getName() + " onComplete");
}
};
Observable observable1 = observable0.subscribeOn(Schedulers.newThread());
Log.d(getClass().getName(), Thread.currentThread().getName() + " observable1:"+observable1.getClass().getName());
Observable observable2 = observable1.observeOn(AndroidSchedulers.mainThread());
Log.d(getClass().getName(), Thread.currentThread().getName() + " observable2:"+observable2.getClass().getName());
observable2.subscribe(observer);
被观察者和观察者的创建和之前一样,在建立订阅关系时调用subscribeOn
和observeOn
方法进行线程的切换。这里每个方法返回的都是Observable
类型,所以可以采用链式调用,这也是RxJava
的一个特点,但是这里没有采用这种写法,而是将其拆分开来写并且日志打印出每个Observable
的具体类型,这是为了方便之后源码理解。 运行结果日志:
4.1 subscribeOn
Observable observable1 = observable0.subscribeOn(Schedulers.newThread());
Log.d(getClass().getName(), Thread.currentThread().getName() + " observable1:"+observable1.getClass().getName());
observable1.subscribe(observer);
运行结果:
先只调用subscribeOn
方法运行查看结果,发现不仅被观察者发射事件运行在了子线程,观察者接收事件也运行在子线程,那么进入subscribeOn
方法查看它的实现。
public final Observable subscribeOn(Scheduler scheduler) {
ObjectHelper.requireNonNull(scheduler, “scheduler is null”);
return RxJavaPlugins.onAssembly(new ObservableSubscribeOn(this, scheduler));
}
可以看到subscribeOn
方法和subscribe
方法有些类似。首先是判断传入的scheduler
是否为空,然后同样调用RxJavaPlugins.onAssembly
方法,这次构建了一个ObservableSubscribeOn
对象返回。而subscribeOn
方法之后还是调用了subscribe
方法,根据之前的分析,subscribe
方法最终会调用到subscribeActual
方法,不过此时的subscribeActual
方法不再是ObservableCreate
中的而是ObservableSubscribeOn
中的subscribeActual
方法。
@Override
public void subscribeActual(final Observer<? super T> observer) {
final SubscribeOnObserver parent = new SubscribeOnObserver(observer);
observer.onSubscribe(parent);
parent.setDisposable(scheduler.s