该篇从基础源码(不包含操作符)对rxjava进行分析,这里引用了最新的rxjava3.0源码。分别从Observable创建、Observer创建、Observable及Observer的订阅进行分析。
1. Observable创建
Observable创建方法很多,这里我们只看create方法源码
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
这里new了一个ObservableCreate对象,并传入了ObservableOnSubscribe对象。可以看到ObservableOnSubscribe接口中只有subscribe()方法,而该函数正是Observable中发射事件的回调函数,也就是发射事件的业务逻辑要写在它的函数中。接下来继续看ObservableCreate类。
public final class ObservableCreate<T> extends Observable<T> {
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
...
}
可以看到ObservableCreate继承自Observable类,也正是我们创建并返回的Observable对象。接下来看Observer对象的创建。
2.Observer创建
Observer是一个接口,而接口内只有4个方法,需要开发者来实现。
public interface Observer<T> {
void onSubscribe(@NonNull Disposable d);
void onNext(@NonNull T t);
void onError(@NonNull Throwable e);
void onComplete();
}
几个方法很简单,onSubscribe 方法中可以取消订阅, onNext 为接收上游事件的方法, onError为错误发生回调方法, onComplete为事件结束的回调方法。
3. 订阅
订阅我们看Observable类中subscribeWith方法
public final <E extends Observer<? super T>> E subscribeWith(E observer) {
subscribe(observer);
return observer;
}
看subscribe方法
public final void subscribe(Observer<? super T> observer) {
ObjectHelper.requireNonNull(observer, "observer is null");
try {
observer = RxJavaPlugins.onSubscribe(this, observer); ObjectHelper.requireNonNull(observer, "...");
subscribeActual(observer);
} catch (NullPointerException e) { // NOPMD
throw e;
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
RxJavaPlugins.onError(e);
NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
npe.initCause(e);
throw npe;
}
}
接下来看subscribeActual是一个抽象方法,它是在Observable子类ObservableCreate类中实现的,来看其实现类方法subscribeActual源码
protected void subscribeActual(Observer<? super T> observer) {
CreateEmitter<T> parent = new CreateEmitter<T>(observer);
observer.onSubscribe(parent);
try {
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
subscribeActual()方法中首先创建了CreateEmitter对象,该对象的作用为用于发射事件,用于发射onNext onError onCompele等事件。 然后执行observer.onSubscribe(parent) 该方法正是上面观察者中介绍的用于取消订阅的方法。先看最后面的异常捕获部分,它执行了parent.onError(ex) 发射error事件。 接下来try包含着的代码source.subscribe(parent),source对象是ObservableOnSubscribe类型。
public interface ObservableOnSubscribe<T> {
void subscribe(@NonNull ObservableEmitter<T> emitter) throws Exception;
}
ObservableOnSubscribe是一个接口,是不是很熟悉的一个接口。
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("baby ,it's time for lunch");
}
})
没错,它正是Observable创建中,订阅后回调方法,该方法正是用于发射事件的,下面是observable订阅的一个时序图。
时序图:

总结
整体流程很简单,首先创建Observable,创建Observable时会创建一个ObservableCreate对象,在该对象中会传入ObservableOnSubscribe对象(抽象类,开发者实现)。然后创建Observer。最后让我们创建好的Observable订阅Observer,在subscribeActual()方法中首先会创建一个CreateEmitter发射器对象,发射器包含Observer对象用于事件的发送。然后会执行到Observer对象的onSubscribe()方法,在该方法中开发者可以取消订阅。最后会执行到'ObservableOnSubscribe.subscribe(CreateEmitter emitter)'方法(抽象类,开发者实现)。在该方法中开发者可以利用发射器发射各种事件(onNext, onComplete...)。并且会对该方法做异常捕获, 如果有异常发生,会通过发射器发送onError事件。