上一篇已经介绍了Rxjava的整体链式设计原理和思想,今天我们介绍和分析最常用的操作符create以及其源码设计。
create操作符主要用于创建一个源observable,即链式操作的第一个observable:事件源。结合上一篇的整体分析,我们先看看一个operator的图,并结合图和源码分析create操作符:
首先看看create操作符的使用代码:
Observable observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("hello");
}
});
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
System.out.println("onSubscribe");
}
@Override
public void onNext(String value) {
System.out.println("onNext");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
};
observable.subscribe(observer);
由于是第一个observable,因此create被设计成Observable类的静态方法(应该是所有创建第一个observable的operator都被设计成了静态方法,如just,fromArray等,而需要上一个observable作为source的observable对应的operator都被设计为实例方法)。并传入一个ObservableOnSubscribe接口的子类对象,该对象即是真正的事件源,会回调subscribe 方法,并通过e.onNext("hello");开始发送事件。create的源码如下:
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
ObjectHelper.requireNonNull(source, "source is null");
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
create操作符对应的observable是ObservableCreate,是Observable的子类,其构造函数源码如下:
final ObservableOnSubscribe<T> source;
public ObservableCreate(ObservableOnSubscribe<T> source) {
this.source = source;
}
发现其source是一个ObservableOnSubscribe接口,而不是一个observable。因为它是第一个observable,因此source不需要一定是observable。而create要求我们使用时传入一个实现ObservableOnSubscribe接口的对象作为其source,即事件源。再来看看subscribeActual源码:
@Override
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);
}
}
将订阅的observer封装到CreateEmitter中,然后调用source.subscribe(parent);那么ObservableCreate对应的observer就是CreateEmitter。查看CreateEmitter源码发现,其是Emitter接口的子类,并不是Observer接口的子类。个人认为这样设计主要是从概念上区分,Emitter是发射器的意思,ObservableCreate是第一个observable,那么对应的observer也是最外层第一个,可以理解成发射器;其次Observer接口有个onSubscribe方法,而作为第一个observer是不需要的。那么将上图对应内容修改为create操作符的内容,就得到如下图所示:
create操作符会创建一个ObservableCreate,然后调用subscribe()—>subscribeActual()订阅observer,并用CreateEmitte对observer进行封装,然后调用ObservableOnSubscribe.subscribe()订阅emitter。在订阅方法中,调用发射器的onnext方法,发送事件。
-------------------------------------------------
欢迎关注我的微信公众号