Observable Observer
源码版本 2.1.7 https://github.com/ReactiveX/RxJava/tree/v2.1.7
Observable.create((ObservableOnSubscribe) e -> {
e.onNext(1);
e.onNext(2);
}).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer integer) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
Observable作为生产者, 可以发送事件, 同时Observer作为观察者, 可以收到事件;
源码分析的目的:
- Observable 如何生产事件
- Observable 怎么同 Observer 关联在一起
- Observer 如何接收事件 (即Observer的onNext方法如何被调用)
1. Observable.create 方法
1.1 Observable.create
public static Observable create(ObservableOnSubscribe source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate(source));
}
`Observable.create` 是个静态方法, 逻辑比较简单
1. 对入参的检测
2. 使用我们代码传入的 `ObservableOnSubscribe`对象, 构建 `ObservableCreate`
3. 调用 RxJavaPlugins.onAssembly 方法并返回
1.2 RxJavaPlugins.onAssembly
先看 RxJavaPlugins.onAssembly
/**
* Calls the associated hook function.
* @param the value type
* @param source the hook's input value
* @return the value returned by the hook
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@NonNull
public static Observable onAssembly(@NonNull Observable source) {
// 用于hook, 默认 onObservableAssembly 为null
Function super Observable, ? extends Observable> f = onObservableAssembly;
if (f != null) {
return apply(f, source);
}
return source;
}
RxJavaPlugins.onAssembly 是一个用于hook的方法, 默认onObservableAssembly
为null, 传入Observable和返回的Observable是同一个对象, 没有做任何处理;
这个hook的接口, 在平时使用中, 没用到过, 具体用于做啥, 还要去看
源码中有很多地方使用
RxJavaPlugins
进行了hook, 应该是设计用于使用者扩展; 但大部分都是和这个一样, 默认是传入什么, 就输出什么, 没做任何改变;
1.3 ObservableCreate
上面说过,RxJavaPlugins.onAssembly
是一个用于hook方法, 对输入没做任何处理, 在Observable.create
的流程中, 核心也就只剩下创建 ObservableCreate
对象了;
ObservableCreate
继承于 Observable
, 内部拥有一个ObservableOnSubscribe
(由构建时传入);
到此,Observable.create
的流程结束
简单说, Observable.create
就只是创建了一个 ObservableCreate
对象, 该对象也是一个Observable, 并且持有我们传入的 ObservableOnSubscribe
;
2 Observable.subscribe
2.1 Observable.subscribe(Observer)
public final void subscribe(Observer super T> observer) {
ObjectHelper.requireNonNull(observer, "observer is null");
try {
// hook 方法
observer = RxJavaPlugins.onSubscribe(this, observer);
// 入参检测
ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");
// 实际执行的方法
subscribeActual(observer);
} catch (NullPointerException e) { // NOPMD
throw e;
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
// can't call onError because no way to know if a Disposable has been set or not
// can't call onSubscribe because the call might have set a Subscription already
RxJavaPlugins.onError(e);
NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
npe.initCause(e);
throw npe;
}
}
- hook扩展, 和上面创建Observable时的hook一样, 默认输入和输出一样, 没做任何处理
- 入参检测
- 执行事实际Observable对象
subscribeActual
方法, 上面的分析可以看出, 就是ObservableCreate.subscribeActual
方法 - 错误处理
subscribe有很多重载方法, 但都会转换成Observer的调用; 其他的几个方法, 都会在内部被构建成
LambdaObserver
对象, 然后调用;
2.2 Observable.subscribeActual
上面说过, Observable.create方法创建的Observable对象, 实际是ObservableCreate
, 直接看ObservableCreate.subscribeActual
方法;
@Override
protected void subscribeActual(Observer super T> observer) {
// 1. 创建Emitter对象, Observer和Emitter关联在一起
CreateEmitter parent = new CreateEmitter(observer);
// 2. 调用Observer的onSubscribe方法
observer.onSubscribe(parent);
try {
// 3. 调用ObservableOnSubscribe的subscribe方法, 开始发送事件
source.subscribe(parent);
} catch (Throwable ex) {
Exceptions.throwIfFatal(ex);
parent.onError(ex);
}
}
- 创建
CreateEmitter
对象, 同时会我们的Observer
对象传入, 此时Observer
和Emitter
关联到一起了;并且CreateEmitter
对象,也实现了disposable
接口; - 调用
observer
的onSubscribe
方法; - 调用
source.subscribe
;- source是我们在使用Observable.create构建Observable时, 传入的
ObservableOnSubscribe
对象; - 实际调用
ObservableOnSubscribe
的subscribe
方法, 并将CreateEmitter
作为参数传递了过去; -
ObservableOnSubscribe.subscribe
是由我们自己实现的, 里面调用ObservableEmitter.onNext
发送事件; 即调用CreateEmitter
的onNext
方法
- source是我们在使用Observable.create构建Observable时, 传入的
2.2 CreateEmitter.onNext
上面说了,创建CreateEmitter
对象时, 会将Observer
传递过去; 发送事件,最终调用的也是CreateEmitter
的onNext
方法; 看上去Observable发送事件, Observer接收事件,即将关联到一起, 直接看CreateEmitter.onNext
的代码;
@Override
public void onNext(T t) {
// 1. null value的处理
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()) {
// 2. 发送事件, 即直接调用 Observer的onNext
observer.onNext(t);
}
}
- null值处理, RxJava在2.x的版本中, 已经不允许发送null;
- 发送事件, 即直接调用 Observer的onNext方法;
还有使用Observable.just, single 等方法创建的Observable, 都和create创建的类似, 一般都是创建一个具体的Observable对象, 在subscribeActual中创建一个对应的Observer对象, 将原始的Observer包装起来, 然后直接在包装类中, 调用原始Observer的onNext方法;
到此基本分析已结束
绕了一圈, 发现发送和接收事件, 其实就是将Observable和Observer组装到一起, 然后直接调用onNext方法, 是不是有点大失所望; 不过作为观察者模式的一种, RxJava的核心在于数据流转换,和线程切换, 后面再讲;
附上一张简单的类图