rxjava3.0 入门到精通系列(二) 基础源码分析

1,047 阅读3分钟

该篇从基础源码(不包含操作符)对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事件。