RxJava2.0│流程的源码解析

108 阅读21分钟
原文链接: mp.weixin.qq.com

☝点击上方蓝字,关注我们!

在此,我们通过以下代码,在Observable模式下,对订阅流程、线程调度、操作符等完整流程进行源码解析。

实际上,整个的流程操作,包含了对象创建、逆向订阅、任务执行这三个步骤。

Observable代码示例:

1private void observableTest() { 2    Observable.create(new ObservableOnSubscribe<Integer>() { 3        @Override 4        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception { 5            Log.d(TAG, "print create: " + 1); 6            emitter.onNext(1); 7 8        } 9    }).map(new Function<Integer, String>() {10        @Override11        public String apply(Integer integer) throws Exception {12            Log.d(TAG, "print map: " + integer.toString() + " is String!!!");13            return integer.toString() + " is String!!!";14        }15    }).doOnNext(new Consumer<String>() {16        @Override17        public void accept(String s) throws Exception {18            Log.d(TAG, "print doOnNext: " + s);1920        }21    }).subscribeOn(Schedulers.io())22            .observeOn(AndroidSchedulers.mainThread())23            .subscribe(new Consumer<String>() {24                @Override25                public void accept(String s) throws Exception {26                    Log.d(TAG, "print success: " + s);27                }28            }, new Consumer<Throwable>() {29                @Override30                public void accept(Throwable throwable) throws Exception {31                    Log.d(TAG, "error");32                }33            });34}

步骤:

(1) create一个Observable对象,并在subscribe()回调中执行onNext操作;

(2) 利用map操作符将int类型的数据转换成string类型的数据;

(3) 利用doOnNext操作符对上游发射的字符串进行进一步处理;

(4) 通过subscribeOn进行上游操作的线程调度;

(5) 通过observeOn进行下游操作的线程调度;

(6) 通过subscribe进行订阅,并在Consumer的回调中执行相应代码。

在梳理执行过程之前,我们先看一下Observable这个抽象类:

1public abstract class Observable<T> implements ObservableSource<T>

Observable类实现了ObservableSource接口,ObservableSource接口里定义了一个方法:

1public interface ObservableSource<T> {  23    /** 4     * Subscribes the given Observer to this ObservableSource instance. 5     * @param observer the Observer, not null 6     * @throws NullPointerException if {@code observer} is null 7     */  8    void subscribe(@NonNull Observer<? super T> observer);  9}

在Observable类中对subscribe()的实现如下:

1@SchedulerSupport(SchedulerSupport.NONE)   2@Override   3public final void subscribe(Observer<? super T> observer) {   4    ObjectHelper.requireNonNull(observer, "observer is null");   5    try {   6        observer = RxJavaPlugins.onSubscribe(this, observer);   7 8        ObjectHelper.requireNonNull(observer, "Plugin returned null Observer");   910        subscribeActual(observer);  11    } catch (NullPointerException e) { // NOPMD  12        throw e;  13    } catch (Throwable e) {  14        Exceptions.throwIfFatal(e);  15        // can't call onError because no way to know if a Disposable has been set or not  16        // can't call onSubscribe because the call might have set a Subscription already  17        RxJavaPlugins.onError(e);  1819        NullPointerException npe = new NullPointerException("Actually not, but can't throw other exceptions due to RS");  20        npe.initCause(e);  21        throw npe;  22    }  23} 

从如上代码中,我们看到在进行了一系列错误检查后,我们发现真正执行的代码是:

1subscribeActual(observer);   

而这个方法是Observable类中定义的一个抽象方法:

1protected abstract void subscribeActual(Observer<? super T> observer);  

到此,我们先记住Observable这个类对subscribe()的实现过程,暂时不对subscribeActual()在各个子类中的具体实现做分析,直接进入代码的执行过程。

1. 对象创建

(1) 从create开始:

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

我们依然跳过错误检查,直接看:

1return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));  

onAssembly()实际上是hook function,如果我们没有进行任何配置,返回的就是我们传入的Observable对象:

1@SuppressWarnings({ "rawtypes", "unchecked" })  2@NonNull  3public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {  4    Function<? super Observable, ? extends Observable> f = onObservableAssembly;  5    if (f != null) {  6        return apply(f, source);  7    }  8    return source;  9}  

在此我们跳过hook,看看ObservableCreate()都做了什么:

1public ObservableCreate(ObservableOnSubscribe<T> source) {  2    this.source = source;  3}

在这个构造方法中,其实只是将我们传入的ObservableOnSubscribe对象存了下来,然后返回一个Observable对象。

(2) map()

接下来我们回到observableTest()中看map方法的执行:

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.NONE)  3public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {  4    ObjectHelper.requireNonNull(mapper, "mapper is null");  5    return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));  6}  

依然跳过错误检查和hook,看看ObservableMap和其父类的构造方法:

1public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {  2    super(source);  3    this.function = function;  4} 

父类的构造方法:

1AbstractObservableWithUpstream(ObservableSource<T> source) {  2    this.source = source;  3}

在此我们看到构造方法中依旧只是对传入的ObservableSource对象进行了存储,并返回一个Observable对象。

由此,我们可以推测,步骤3,4,5的流程也是如此:

(3) doOnNext

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.NONE)  3public final Observable<T> doOnNext(Consumer<? super T> onNext) {  4    return doOnEach(onNext, Functions.emptyConsumer(), Functions.EMPTY_ACTION, Functions.EMPTY_ACTION);  5}

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.NONE)  3private Observable<T> doOnEach(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete, Action onAfterTerminate) {  4    ObjectHelper.requireNonNull(onNext, "onNext is null");  5    ObjectHelper.requireNonNull(onError, "onError is null");  6    ObjectHelper.requireNonNull(onComplete, "onComplete is null");  7    ObjectHelper.requireNonNull(onAfterTerminate, "onAfterTerminate is null");  8    return RxJavaPlugins.onAssembly(new ObservableDoOnEach<T>(this, onNext, onError, onComplete, onAfterTerminate));  9}  

1public ObservableDoOnEach(ObservableSource<T> source, Consumer<? super T> onNext,   2                          Consumer<? super Throwable> onError,   3                          Action onComplete,   4                          Action onAfterTerminate) {   5    super(source);   6    this.onNext = onNext;   7    this.onError = onError;   8    this.onComplete = onComplete;   9    this.onAfterTerminate = onAfterTerminate;  10} 

(4) subscribeOn

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.CUSTOM)  3public final Observable<T> subscribeOn(Scheduler scheduler) {  4    ObjectHelper.requireNonNull(scheduler, "scheduler is null");  5    return RxJavaPlugins.onAssembly(new ObservableSubscribeOn<T>(this, scheduler));  6} 

1public ObservableSubscribeOn(ObservableSource<T> source, Scheduler scheduler) {  2    super(source);  3    this.scheduler = scheduler;  4} 

(5) observeOn

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.CUSTOM)  3public final Observable<T> observeOn(Scheduler scheduler) {  4    return observeOn(scheduler, false, bufferSize());  5} 

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.CUSTOM)  3public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {  4    ObjectHelper.requireNonNull(scheduler, "scheduler is null");  5    ObjectHelper.verifyPositive(bufferSize, "bufferSize");  6    return RxJavaPlugins.onAssembly(new ObservableObserveOn<T>(this, scheduler, delayError, bufferSize));  7}  

1public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) {  2    super(source);  3    this.scheduler = scheduler;  4    this.delayError = delayError;  5    this.bufferSize = bufferSize;  6} 

到此为止,我们发现,前面的一系列操作,都是在构造方法里存储传入的ObservableSource等并返回一个Observable对象。除此之外并没有做什么操作,也没有对上游的数据进行任何处理。那我们来看看最后一步subscribe都做了什么:

1@CheckReturnValue  2@SchedulerSupport(SchedulerSupport.NONE)  3public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError) {  4    return subscribe(onNext, onError, Functions.EMPTY_ACTION, Functions.emptyConsumer());  5}

1@CheckReturnValue   2@SchedulerSupport(SchedulerSupport.NONE)   3public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError,   4        Action onComplete, Consumer<? super Disposable> onSubscribe) {   5    ObjectHelper.requireNonNull(onNext, "onNext is null");   6    ObjectHelper.requireNonNull(onError, "onError is null");   7    ObjectHelper.requireNonNull(onComplete, "onComplete is null");   8    ObjectHelper.requireNonNull(onSubscribe, "onSubscribe is null");   910    LambdaObserver<T> ls = new LambdaObserver<T>(onNext, onError, onComplete, onSubscribe);  1112    subscribe(ls);  1314    return ls;  15}

在进行了错误检查和hook后,会创建一个LamdaObserver对象:

1public LambdaObserver(Consumer<? super T> onNext, Consumer<? super Throwable> onError,  2        Action onComplete,  3        Consumer<? super Disposable> onSubscribe) {  4    super();  5    this.onNext = onNext;  6    this.onError = onError;  7    this.onComplete = onComplete;  8    this.onSubscribe = onSubscribe;  9} 

之后执行了Observable的subscribe(ls)方法。到这我们会觉着似曾相识,还记着最上面我们提到Observable类中对subscribe()的实现么?在对subscribe()的实现中,subscribeActual()将被执行。subscribeActual()是Observable类中定义的一个抽象方法,由此可见,在从上游到下游创建了一系列Observable对象后,将在subscribe的过程中逐一被订阅。在此我们推测,这个订阅过程是从下游到上游逆向的。接下来我们看相应的代码实现:

2. 逆向订阅

(1) observeOn

1@Override   2protected void subscribeActual(Observer<? super T> observer) {   3    if (scheduler instanceof TrampolineScheduler) {   4        source.subscribe(observer);   5    } else {   6        Scheduler.Worker w = scheduler.createWorker();   7 8        source.subscribe(new ObserveOnObserver<T>(observer, w, delayError, bufferSize));   9    }  10} 

1ObserveOnObserver(Observer<? super T> actual, Scheduler.Worker worker, boolean delayError, int bufferSize) {  2    this.actual = actual;  3    this.worker = worker;  4    this.delayError = delayError;  5    this.bufferSize = bufferSize;  6} 

在ObservableObserveOn类中对subscribeActual的实现里,我们看到首先创建了一个线程调度相关的Worker对象,之后调用了上游Observable对象的subscribe方法:source.subscribe(),完成了观察者ObserveOnObserver和被观察者之间的订阅流程。接下来我们再看一下上游subscribeOn过程中的subscribeActual的实现。

(2) subscribeOn

1@Override  2public void subscribeActual(final Observer<? super T> s) {  3    final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(s);  45    s.onSubscribe(parent);  67    parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));  8} 

1SubscribeOnObserver(Observer<? super T> actual) {  2    this.actual = actual;  3    this.s = new AtomicReference<Disposable>();  4}  

SubscribeTask()实际上在实现Runnable接口时,创建一个SubscribeOnObserver对象,并调用了上游Observable对象的subscribe方法进行订阅:source.subscribe(parent),然后为上游的操作进行线程调度(在此先不对线程调度做深入分析),再交由上游处理,我们接着看上游:

(3) doOnNext

1@Override  2public void subscribeActual(Observer<? super T> t) {  3    source.subscribe(new DoOnEachObserver<T>(t, onNext, onError, onComplete, onAfterTerminate));  4}  

1DoOnEachObserver(   2        Observer<? super T> actual,   3        Consumer<? super T> onNext,   4        Consumer<? super Throwable> onError,   5        Action onComplete,   6        Action onAfterTerminate) {   7    this.actual = actual;   8    this.onNext = onNext;   9    this.onError = onError;  10    this.onComplete = onComplete;  11    this.onAfterTerminate = onAfterTerminate;  12}  

doOnNext创建了一个DoOnEachObserver对象,订阅后直接交由上游处理。

(4) map:

1@Override  2public void subscribeActual(Observer<? super U> t) {  3    source.subscribe(new MapObserver<T, U>(t, function));  4}  

1@Override  2public void subscribeActual(Observer<? super U> t) {  3    source.subscribe(new MapObserver<T, U>(t, function));  4}  

map创建了一个MapObserver对象,订阅后继续交由上游处理:

(5) create:

1@Override   2protected void subscribeActual(Observer<? super T> observer) {   3    CreateEmitter<T> parent = new CreateEmitter<T>(observer);   4    observer.onSubscribe(parent);   5 6    try {   7        source.subscribe(parent);   8    } catch (Throwable ex) {   9        Exceptions.throwIfFatal(ex);  10        parent.onError(ex);  11    }  12}  

现在我们回到了最上游,从代码中我们可以看到,首先调用了observer.onSubscribe(),这里的observer来自map。最上游的source.subscribe()的source是我们传入的ObservableOnSubscribe对象,而执行的subscribe()方法会被回调到我们最一开始的示例代码中,执行emitter.onNext():

1Observable.create(new ObservableOnSubscribe<Integer>() {  2    @Override  3    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {  4        Log.d(TAG, "print create: " + 1);  5        emitter.onNext(1);  67    }  8}) 

到此为止,我们可得知整个订阅过程是从下至上逆向的,下一级的Observable会生成一个Observer对象,与上一级的source进行订阅。

在完成了对象创建和订阅的过程,我们终于可以看到代码真正的执行了。

3. 任务执行

(1) create:

接着我们上面的流程继续,emitter.onNext(1)将会被执行,跟踪下去,走到CreateEmitter的onNext方法中去:

1public interface Emitter<T> {   2 3    /**  4     * Signal a normal value.  5     * @param value the value to signal, not null  6     */   7    void onNext(@NonNull T value);   8 9    /** 10     * Signal a Throwable exception. 11     * @param error the Throwable to signal, not null 12     */  13    void onError(@NonNull Throwable error);  1415    /** 16     * Signal a completion. 17     */  18    void onComplete();  19}  

1@Override   2public void onNext(T t) {   3    if (t == null) {   4        onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));   5        return;   6    }   7    if (!isDisposed()) {   8        observer.onNext(t);   9    }  10}  

我们可以看到,这里调用了observer的onNext()方法:

1observer.onNext(t);  

这里的observer,如逆向订阅流程的分析,便是下游map对应的Observer,既然如此,我们看一下MapObserver的onNext()都做了什么。

(2) map:

1@Override   2public void onNext(T t) {   3    if (done) {   4        return;   5    }   6 7    if (sourceMode != NONE) {   8        actual.onNext(null);   9        return;  10    }  1112    U v;  1314    try {  15        v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");  16    } catch (Throwable ex) {  17        fail(ex);  18        return;  19    }  20    actual.onNext(v);  21}  

我们看到在做了一些列检查之后,首先调用的是mapper.apply(t)方法,而mapper就是我们传入的function,所以回到我们observableTest()方法,可以看到apply()方法的执行:

1map(new Function<Integer, String>() {  2    @Override  3    public String apply(Integer integer) throws Exception {  4        Log.d(TAG, "print map: " + integer.toString() + " is String!!!");  5        return integer.toString() + " is String!!!";  6    }  7})  

上面代码中,我们修改了数据类型,返回了一个字符串给MapObserver继续处理,触发actual.onNext(v)的执行。从构造方法中我们可以看到,这个actual就是下游的doOnNext对应的Observer。接下来我们继续看doOnEachObserver中onNext()的代码。

(3) doOnNext

1@Override   2public void onNext(T t) {   3    if (done) {   4        return;   5    }   6    try {   7        onNext.accept(t);   8    } catch (Throwable e) {   9        Exceptions.throwIfFatal(e);  10        s.dispose();  11        onError(e);  12        return;  13    }  1415    actual.onNext(t);  16}  

我们看到首先执行了onNext.accept(t),也就是回调到observableTest()里执行的方法:

1doOnNext(new Consumer<String>() {  2    @Override  3    public void accept(String s) throws Exception {  4        Log.d(TAG, "print doOnNext: " + s);  56    }  7})  

返回一个字符串给doOnEachObserver处理,再通过actual.onNext()给下游subscribeOn的Observer进行处理。所以我们继续看SubscribeOnObserver中onNext()的实现:

(4) subscribeOn

1@Override  2public void onNext(T t) {  3    actual.onNext(t);  4}  

直接走到下游observeOn传入的Observer的onNext(),即ObserveOnObserver的onNext():

(5) observeOn

1@Override   2public void onNext(T t) {   3    if (done) {   4        return;   5    }   6 7    if (sourceMode != QueueDisposable.ASYNC) {   8        queue.offer(t);   9    }  10    schedule();  11}  

在这里进行了线程调度(具体的线程调度流程下一节分析),最后执行了schedule()方法后,走到了Runnable的run()方法里面:

1@Override  2public void run() {  3    if (outputFused) {  4        drainFused();  5    } else {  6        drainNormal();  7    }  8}  

drainFused()和drainNormal()方法里,最终都是根据场景不同而执行了actual.onNext(),onComplete()或onError()方法,这个actual就是ObserveOnObserver构造时创建的下游Observer,即LambdaObserver。所以接下来会执行LambdaObserver的onNext(), onComplete()和onError()方法。

(6) subscribe:

1@Override   2public void onNext(T t) {   3    if (!isDisposed()) {   4        try {   5            onNext.accept(t);   6        } catch (Throwable e) {   7            Exceptions.throwIfFatal(e);   8            get().dispose();   9            onError(e);  10        }  11    }  12}  1314@Override  15public void onError(Throwable t) {  16    if (!isDisposed()) {  17        lazySet(DisposableHelper.DISPOSED);  18        try {  19            onError.accept(t);  20        } catch (Throwable e) {  21            Exceptions.throwIfFatal(e);  22            RxJavaPlugins.onError(new CompositeException(t, e));  23        }  24    } else {  25        RxJavaPlugins.onError(t);  26    }  27}  2829@Override  30public void onComplete() {  31    if (!isDisposed()) {  32        lazySet(DisposableHelper.DISPOSED);  33        try {  34            onComplete.run();  35        } catch (Throwable e) {  36            Exceptions.throwIfFatal(e);  37            RxJavaPlugins.onError(e);  38        }  39    }  40}  

在这里,我们可根据传参,进行最终的数据操作。到此为止,一个完整的Observable流程便走完了。

4. 总流程图

我们将此过程归纳成流程图,红箭头代表着执行过程:


狐友技术团队其他精彩文章

Swift之Codable实战技巧

不了解GIF的加载原理?看我就够了!

安卓系统权限,你真的了解吗?

AspectJ在Android中的应用


加入搜狐技术作者天团

千元稿费等你来!

戳这里!☛