Rxjava 源码分析一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/starlight_2012/article/details/81292460

1、概述

rxjava官方给出来的定义是组成异步和事件通过观测序列的基础程序库。rxjava通过观测者模式实现观察者和被观察者之间数据改变,通过修饰者模式实现不通操作符转换。

2、源码分析

主要通过分析rxjava2.0代码了解rxjava如何使用观察者和被观察者之间订阅关系,首先分析Observable.create方法,我们可以通过Observable.create创建自定义对象,在调用create方法时传递ObservableOnSubscrible接口

@CheckReturnValue
@SchedulerSupport(SchedulerSupport.NONE)
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
            ObjectHelper.requireNonNull(source, "source is null");
            return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}

在调用create方法时会判断当前传递的ObservableOnSubscrible对象是否为空,为空抛出异常。

     public static <T> T requireNonNull(T object, String message) {
        if (object == null) {
            throw new NullPointerException(message);
        }
        return object;
    }

然后通过调用RxjavaPlugins.onAssembly方法创建一个Observable对象。先创建一个Observablecreate对象包裹ObservableOnSubscrible,ObservableOnSubscrible是继承Observable,然后传递给onAssembly方法。

     @SuppressWarnings({ "rawtypes", "unchecked" })
    @NonNull
    public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
        Function<? super Observable, ? extends Observable> f = onObservableAssembly;
        if (f != null) {
            return apply(f, source);
        }
        return source;
    }

在onAssembly方法中先判断是否需要hook,当前不hook方法直接返回source方法,source就是ObservableCreate对象,然后我们通过调用subscribe方法订阅

     @SchedulerSupport(SchedulerSupport.NONE)
    public final Disposable subscribe() {
        return subscribe(Functions.emptyConsumer(), Functions.ON_ERROR_MISSING, Functions.EMPTY_ACTION, Functions.emptyConsumer());
    }
     @CheckReturnValue
    @SchedulerSupport(SchedulerSupport.NONE)
    public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,
            Action onComplete, Consumer<? super Disposable> onSubscribe) {
        ObjectHelper.requireNonNull(onNext, "onNext is null");
        ObjectHelper.requireNonNull(onError, "onError is null");
        ObjectHelper.requireNonNull(onComplete, "onComplete is null");
        ObjectHelper.requireNonNull(onSubscribe, "onSubscribe is null");

        LambdaObserver<T> ls = new LambdaObserver<T>(onNext, onError, onComplete, onSubscribe);

        subscribe(ls);

        return ls;
    }

在subscrible方法中,如果用户没有传递onNex、onError、onComplete和onSubscrible rxjava帮忙创建相关方法,然后组装成LambdaObserver对象,然后调用subscribe方法

     @SchedulerSupport(SchedulerSupport.NONE)
    @Override
    public final void subscribe(Observer<? super T> observer) {
        ObjectHelper.requireNonNull(observer, "observer is null");
        try {
            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;
        }
    }

在subscrible方法中检测Observer对象是否为空,然后调用subscribleActual方法,这个方法就是刚才创建的ObservbleCreate对象

 @Override
protected void subscribeActual(Observer<? super T> observer) {
    CreateEmitter<T> parent = new CreateEmitter<T>(observer);
    //observable中onSubscrible方法,保证onSubscrible在onNext和onError方法之前调用
    observer.onSubscribe(parent);

    try {
        //实际观察者调用的方法
        source.subscribe(parent);
    } catch (Throwable ex) {
        Exceptions.throwIfFatal(ex);
        parent.onError(ex);
    }
}

在subscribleActual方法中创建一个发射器,然后调用Observer的onSubscrible方法,把发射器传递给onSubscrible中,然后调用onSubscrible,这个Observable.onSubscrible就是我们通过Obserable.create创建时候实现ObservableOnSubscrible实现类,通过try catch把异常捕获,如果异常后调用createEmitter中onError方法,在CreateEmitter中的Error方法实际是调用rxjava封装的LambdaObserver中的onError方法。

3 类图分析

![这里写图片描述](https://img-blog.csdn.net/20180811224404531?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N0YXJsaWdodF8yMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

我们在通过Observable.create方法创建自定义被观察者时,通过创建ObservableOnSubscrible实例对象,rxjava会创建一个修饰者对象ObservableCreate继承Observable存储ObservableOnSubscrible字段,然后我们通过subscribe订阅时通过组装一个LambdaObserver对象,lambdaObserver继承Observer,通过调用subsrcibe实现订阅,订阅后会调用ObservableCreate.subsrcibeActual方法,在ObservableCreate方法中组装一个CreateEmitter发射器对象,然后调用lambdaObserver中onSubscribe方法把发射器传递到lambdaObserver.onSubscribe中,然后调用ObservableOnSubscrible中subscribe方法传入发射器,可以通过发射器调用onNext、onError方法。

4 总结

rxjava是基于观察者模式实现事假订阅,但是有区别于现实中理解,rxjava是通过被观察者订阅观察者实现,在观察者中有被观察者实例,底层是创建lambdaObserver包裹onNext,onError方法,然后通过ObservableCreate中的subscribeActual创建一个CreateEmitter发射器,调用ObservableOnSubscrible中的subscribe方法传递CreateEmitter对象,实现对象引用。

猜你喜欢

转载自blog.csdn.net/starlight_2012/article/details/81292460