Rxjava基本原理解析(三)

    上一篇已经介绍了Rxjava的整体链式设计原理和思想,今天我们介绍和分析最常用的操作符create以及其源码设计。

    create操作符主要用于创建一个源observable,即链式操作的第一个observable:事件源。结合上一篇的整体分析,我们先看看一个operator的图,并结合图和源码分析create操作符:

operator

首先看看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

       create操作符会创建一个ObservableCreate,然后调用subscribe()—>subscribeActual()订阅observer,并用CreateEmitte对observer进行封装,然后调用ObservableOnSubscribe.subscribe()订阅emitter。在订阅方法中,调用发射器的onnext方法,发送事件。

-------------------------------------------------

欢迎关注我的微信公众号

公众号

猜你喜欢

转载自blog.csdn.net/hello_jiangdong/article/details/82586483