RxJava3 Observable.create().subscribe()源码解读:

724 阅读3分钟

入门程序:

        Observable<Object> observable = Observable.create(observer -> {
            observer.onNext(Math.random());
            observer.onComplete();
        });

        observable.subscribe(consumer -> {
            System.out.println("消费的元素是:" + consumer);
        });

        observable.subscribe(consumer->{
            System.out.println("消费的元素是:"+consumer);
        });
打印结果:
消费的元素是:0.48266893835351843
消费的元素是:0.6360686910302946

对于订阅者来讲,Observable代表一连串流动的数据。来看API实现:

@CheckReturnValue
@SchedulerSupport("none")
@NonNull
//create()方法接收参数ObservableOnSubscribe<T>
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
    ObjectHelper.requireNonNull(source, "source is null");
    return RxJavaPlugins.onAssembly(new ObservableCreate(source));
}

//参考Reactor api设计,这里不要将它看成subscribe()订阅动作,它其实就是一个Consumer,接收一个ObservableEmitter<T>
public interface ObservableOnSubscribe<T> {
    void subscribe(@NonNull ObservableEmitter<T> var1) throws Throwable;
}

来看ObservableEmitter接口设计,可以看到Observable.create()接收一个ObservableEmitter用于下发元素产生事件以及其他onError()、onComplete()事件

public interface ObservableEmitter<T> extends Emitter<T> {
    void setDisposable(@Nullable Disposable var1);

    void setCancellable(@Nullable Cancellable var1);

    boolean isDisposed();

    @NonNull
    ObservableEmitter<T> serialize();

    boolean tryOnError(@NonNull Throwable var1);
}

public interface Emitter<T> {
    //封装下发元素动作
    void onNext(@NonNull T var1);

    void onError(@NonNull Throwable var1);

    void onComplete();
}

于是,在入门程序的Observable.create()中传入一个ObservableEmitter的lambda表达式,实现主要其onNext()方法,用于在订阅事件产生之后下发元素。

public void onNext(T t) {
    if (t == null) {
        this.onError(ExceptionHelper.createNullPointerException("onNext called with a null value."));
    } else {
        if (!this.isDisposed()) {
            //回调Observable.onNext()方法
            //this.observer代表subscribeActual()方法中创建CreateEmitter传入的lambdaObserver调用
            this.observer.onNext(t);
        }

    }
}

接着来看subscribe()订阅方法:

@CheckReturnValue
@SchedulerSupport("none")
public final Disposable subscribe(Consumer<? super T> onNext) {
    //传入onNext消费元素过程,以及默认值ON_ERROR、ON_COMPLETE
    return this.subscribe(onNext, Functions.ON_ERROR_MISSING, Functions.EMPTY_ACTION);
}

@CheckReturnValue
@SchedulerSupport("none")
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {
    ObjectHelper.requireNonNull(onNext, "onNext is null");
    ObjectHelper.requireNonNull(onError, "onError is null");
    ObjectHelper.requireNonNull(onComplete, "onComplete is null");
    //在内部将onNext、onError、onComplete、Functions.emptyConsumer()包装为一个LambdaObserver
    LambdaObserver<T> ls = new LambdaObserver(onNext, onError, onComplete, Functions.emptyConsumer());
    this.subscribe((Observer)ls);
    return ls;
}

@SchedulerSupport("none")
public final void subscribe(Observer<? super T> observer) {
    ObjectHelper.requireNonNull(observer, "observer is null");

    try {
        observer = RxJavaPlugins.onSubscribe(this, observer);
        ObjectHelper.requireNonNull(observer, "The RxJavaPlugins.onSubscribe hook returned a null Observer. Please change the handler provided to RxJavaPlugins.setOnObservableSubscribe for invalid null returns. Further reading: https://github.com/ReactiveX/RxJava/wiki/Plugins");
        //订阅,传入LambdaObserver
        this.subscribeActual(observer);
    } catch (NullPointerException var4) {
        throw var4;
    } catch (Throwable var5) {
        Exceptions.throwIfFatal(var5);
        RxJavaPlugins.onError(var5);
        NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");
        npe.initCause(var5);
        throw npe;
    }
}

    protected void subscribeActual(Observer<? super T> observer) {
        //通过lambdaObserver创建CreateEmitter
        ObservableCreate.CreateEmitter<T> parent = new ObservableCreate.CreateEmitter(observer);
        
        //调用LambdaObserver.onSubscribe(),传入通过lambdaObserver创建的CreateEmitter
        observer.onSubscribe(parent);

        try {
            //回调ObservableEmitter.onNext()下发元素,说明Observer实例在没有订阅之前不会发射任何数据。
            this.source.subscribe(parent);
        } catch (Throwable var4) {
            Exceptions.throwIfFatal(var4);
            parent.onError(var4);
        }
    }

接着来看LambdaObserver#onSubscribe(parent)

    public void onSubscribe(Disposable d) {
        if (DisposableHelper.setOnce(this, d)) {
            try {
                //this代表上面subscribe()方法中创建的lambdaObserver
                //this.onSubscribe就是上面给定的 Functions.emptyConsumer(),如果我们在Observable.subscribe()中传入了非默认的Consumer onSubscribe,它便会在订阅时执行。
                this.onSubscribe.accept(this);
            } catch (Throwable var3) {
                Exceptions.throwIfFatal(var3);
                d.dispose();
                this.onError(var3);
            }
        }

    }

    //实际消费元素
    //由ObservableEmitter.onNext回调,而这个onNext就是入门程序传入的消费元素的Consumer
    public void onNext(T t) {
        if (!this.isDisposed()) {
            try {
                this.onNext.accept(t);
            } catch (Throwable var3) {
                Exceptions.throwIfFatal(var3);
                ((Disposable)this.get()).dispose();
                this.onError(var3);
            }
        }
    }

总结:Observable.create()方法通过传入一个ObservableOnSubscribe实现其subscribe()方法从而创建一个发布者ObservableCreate。实现ubscribe()需要接收一个ObservableEmitter,而ObservableEmitter是一系列动作事件的封装体,例如onNext、onError、onComplete分别代表下发元素事件、下发error事件、下发onComplete事件。由于Lambda表达式只是定义一个动作并不会实际执行。当订阅事件subscribe()产生时,在消费过程中创建一个LambdaObserver订阅者(它实现非背压标准接口Observer,类似于Subscriber)并通过ObservableCreate.subscribeActual(LambdaObserver)将发布者订阅者建立关系。在subscribeActual()方法中创建ObservableEmitter并回调ObservableOnSubscribe.subscribe(),通过ObservableEmitter下发各种事件。当调用ObservableEmitter.onNext()下发元素事件时,回调LambdaObserver订阅者Consumer消费元素。另外,每次订阅都会Observable都会执行一次下发元素,因此两次打印结果消费了不同的元素。