RxJava之七——RxJava 2.0 圖文分析create()、 subscribe()、map()、observeOn()、subscribeOn()源碼

前言

16年 的時候寫過兩篇關於Rxjava 1.0 的源碼分析,時過境遷,現在早已是2.0 了。2.0 的代碼邏輯,封裝,更爲易懂,也包含了 一些新特性背壓,面向切面等等。所以決定,寫篇文章分析RxJava 2.0

關於RxJava,從表面上看起來很容易使用,但是如果理解不夠深刻,使用過程中,往往會出現一些問題,所以我寫了系列文章,從入門到精通,從簡單的使用到部分源碼詳解,希望能給讀者一個質的飛躍:
1、RxJava之一——一次性學會使用RxJava RxJava簡單的使用和使用它的好處
2、RxJava之二——Single和Subject 與Observable舉足輕重的類,雖然用的少,但應該知道
3、RxJava之三——RxJava 2.0 全部操作符示例
4、RxJava之四—— Lift()詳解 想要了解Operators,Lift()一定要學習
5、RxJava之五—— observeOn()與subscribeOn()的詳解Scheduler線程切換的原理
6、RxJava之六——RxBus 通過RxJava來替換EventBus
7、RxJava之七——RxJava 2.0 圖文分析create()、 subscribe()、map()、observeOn()、subscribeOn()源碼 這張圖可能是全網最詳細 明瞭的圖

Rxjava2.x 與1.x 的相關文章:

關於 RxJava 最友好的文章—— RxJava 2.0 全新來襲
官方文檔:What’s different in 2.0
RxJava github

示例

Rxjava的使用流程,相信大家都很清楚了,以下面這個簡單的demo,重點分析一下create()、 subscribe()、map()、observeOn()、subscribeOn()源碼。 只要瞭解這些源碼,再去看其他的類都會有似曾相識的感覺

        Observable.create(object : ObservableOnSubscribe<Int> {
            override fun subscribe(emitter: ObservableEmitter<Int>) {
                  emitter.onNext(1)
            }})
            .map(object : Function<Int, String> {
                override fun apply(t: Int): String {
                    return t.toString()
                }}
            )
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<String> {
                override fun onComplete() {
                }

                override fun onSubscribe(d: Disposable) {
                }

                override fun onNext(t: String) {
                }

                override fun onError(e: Throwable) {
                }
            })

在看源代碼時,被其中一層一層的封裝和調用,類名搞的暈暈的,一不留神就不知道誰是誰。
我把源代碼的簡單流程 ,畫了個圖,先腦子裏有個整體的輪廓,再去看代碼,會清晰很多

關於流程圖的介紹:

這張圖,可能是全網關於rxjava2 大體流程,最詳細的圖。爲了排版和方便理解,簡化了函數的關係,忽略了很多細節
在這裏插入圖片描述

  • 綠色模塊 表示訂閱者,例如 ObservableFlowable,或者他們的子類

  • 藍色模塊 表示觀察者,例如 ObserverSubscriber,或者他們的子類

  • 青色模塊 表示數據發送,例如:ObservableOnSubscribeObservableSource,等等

  • 黃色模塊 表示切換了線程

  • 每個模塊右上角表示當前類的名稱

  • 綠色的線 表示函數調用

  • 藍色的線 表示訂閱

  • 紅色的線 表示數據發送

  • 黑色的線 表示對象是什麼或者對象從哪裏來的

基本流程

還是以上面的demo爲例,拋開操作符,只分析主要流程

先來看下,demo中都使用哪些類和接口:

  • Observable 訂閱者
  • Observer 觀察者
  • ObservableOnSubscribe 數據發送源
public interface ObservableOnSubscribe<T> {

    // ObservableEmitter 也是一個接口,它繼承接口Emitter
    void subscribe(@NonNull ObservableEmitter<T> emitter) throws Exception;
}

//這個接口,有常見的幾種函數。在demo中可以看到,調用的oNext 就是這個接口的函數
public interface Emitter<T> {
    void oNext(@NonNull T value);
    void onError(@NonNull Throwable error);
    void onComplete();
}

下面一步一步進入源碼:

create

    public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
         // 判斷非空
        ObjectHelper.requireNonNull(source, "source is null");
        //RxJavaPlugins 相當於是切面編程,會對所有的中間訂閱者進行自定義修改,如果沒有設置過。就直接當前參數
        //創建一個 ObservableCreate,它就是上圖中的綠色模塊
        return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
    }

來看一個RxJavaPlugins.onAssembly

    public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
        // onObservableAssembly  需要手動設置,實現切面效果
        Function<? super Observable, ? extends Observable> f = onObservableAssembly;
        //如果沒有設置 就是null,直接返回參數source
        if (f != null) {
            return apply(f, source);
        }
        return source;
    }

create 傳入的是ObservableOnSubscribe 類型參數,需要的Observable返回類型,這裏的ObservableCreate 繼承了Observable 並實現接口subscribeActual,引用了ObservableOnSubscribe 並調用它的接口subscribe,所以它算是一種適配器模式。

public final class ObservableCreate<T> extends Observable<T> {

    // 每個Observable 的實現類,都有一個source,表示的是上游
    final ObservableOnSubscribe<T> source;

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

    // subscribe 最終會調用到這裏
    // observer 是觀察者,它裏面實現了onNext、onSubscribe 等 這些函數
    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        //調用了觀察者的onSubscribe 方法
        observer.onSubscribe(parent);

        try {
            //這個上游source 就是demo中的ObservableOnSubscribe 實現,
            //調用了subscribe,以本例來說,就會執行 emitter.onNext(1)
            // 那麼問題來了,subscribeActual 會在什麼時候執行呢?
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }

subscribe

需要注意,代碼執行到這裏,是誰調用了subscribe,create() 返回的是Observable類型 ObservableCreate,所以是ObservableCreate調用了subscribe,那麼關於Observable的接口,自然也會調用到ObservableCreate

    public final void subscribe(Observer<? super T> observer) {
        ObjectHelper.requireNonNull(observer, "observer is null");
        try {
            // 面向切面的設置,如果沒有設置,直接返回observer
            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");
            //以本例來看,就是執行ObservableCreate 中的subscribeActual 
            subscribeActual(observer);
        } catch (NullPointerException e) { // NOPMD
            throw e;
        } catch (Throwable e) {
            ... 省略代碼 ...
        }
    }
ObservableCreate 類
    // subscribe 最終會調用到這裏
    // observer 是觀察者,它裏面實現了onNext、onSubscribe 等 這些函數
    @Override
    protected void subscribeActual(Observer<? super T> observer) {
         // 把觀察者,封裝成CreateEmitter
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
        //調用了觀察者的onSubscribe 方法
        observer.onSubscribe(parent);

        try {
            //這個上游source 就是demo中的ObservableOnSubscribe 實現,
            //調用了subscribe,以本例來說,就會執行 emitter.onNext(1),也就是執行了parent.onNext(1)
            source.subscribe(parent);
        } catch (Throwable ex) {
            Exceptions.throwIfFatal(ex);
            parent.onError(ex);
        }
    }

最後進入CreateEmitter 來看一下:

 static final class CreateEmitter<T>
    extends AtomicReference<Disposable>
    implements ObservableEmitter<T>, Disposable {

        private static final long serialVersionUID = -3434801548987643227L;

        final Observer<? super T> observer;

        CreateEmitter(Observer<? super T> observer) {
            //demo 中的observer 最終被傳遞到這裏
            this.observer = observer;
        }

       // 在subscribeActual 調用到這裏
        @Override
        public void onNext(T t) {
            if (t == null) {
                onError(new NullPointerException("onNext called with null. Null values are generally not allowed in 2.x operators and sources."));
                return;
            }
            if (!isDisposed()) {
                //如果沒有disposed ,就會執行demo中observer的onNext
                observer.onNext(t);
            }
        }
          ... 省略代碼 ...

        @Override
        public void onComplete() {
            //如果沒有被dispose,會調用Observer的onComplete()方法
            if (!isDisposed()) {
                try {
                    observer.onComplete();
                } finally {
                    //執行完調用dispose
                    dispose();
                }
            }
        }

       ... 省略代碼 ...
    }

源碼看到這裏,再去看上圖,思路應該更清晰,但是應該對整圖還不是很瞭解。

仔細總結一下會發現,在create後,創建了ObservableCreate ,他知道上游(source),知道被訂閱後的處理方式(subscribeActual )也就是如何把數據發給下游,但是它需要等待調用subscribe,纔會最終觸發這個流程。

而且ObservableCreate 是繼承於Observable ,對設計模式敏感的小夥伴,可能會想到裝飾着模式,沒錯,所謂的操作符,無非就是用裝飾着模式包裹一層,讓他也知道上游(source),知道如何數據發給下游(實現subscribeActual ),最終subscribe 一調用,這個過程就被觸發。

如果感覺混亂,沒關係,下面跟着源碼走一下,就會豁然開朗

map操作符

調用map,會執行下面的函數

    public final <R> Observable<R> map(Function<? super T, ? extends R> mapper) {
        ObjectHelper.requireNonNull(mapper, "mapper is null");
        //發現了嗎,上面的create 創建ObservableCreate  , map 創建了 ObservableMap 
        //沒錯他們都是Observable的子類
        return RxJavaPlugins.onAssembly(new ObservableMap<T, R>(this, mapper));
    }

有了新的Observable (ObservableMap),那肯定得有新的Observer,不然ObservableMap和誰關聯呢?是的,新的Observer就是 MapObserver

//AbstractObservableWithUpstream 繼承於Observable,有成員變量source
public final class ObservableMap<T, U> extends AbstractObservableWithUpstream<T, U> {
    final Function<? super T, ? extends U> function;

    //這裏傳入的是this,也就是本例中的ObservableCreate ,它繼承於Observable 繼承於ObservableSource
    public ObservableMap(ObservableSource<T> source, Function<? super T, ? extends U> function) {
        // 把上游的源保存起來
        super(source);
        //保存當前的操作函數,也就是demo 中map 裏實現的函數
        this.function = function;
    }

    // 太熟悉了,又是它,等ObservableMap 調用subscribe 的時候,會調用到這裏
    @Override
    public void subscribeActual(Observer<? super U> t) {
       // 調用了上游(source)的subscribe,這就相當於觸發了上游
       // 傳入的參數是MapObserver,聯想到上面的subscribe 直接訂閱Observer
       // 這個MapObserver繼承Observer,它的參數t 也是Observer,也就是把下游的Observer 包裹了一層,傳遞給上游。這正是裝飾者模式
       // 本例中emitter.onNext(1)執行後,也就是會執行MapObserver中的onNext
        source.subscribe(new MapObserver<T, U>(t, function));
    }

     //BasicFuseableObserver 繼承了Observer,有成員變量downstream、upstream 等
    static final class MapObserver<T, U> extends BasicFuseableObserver<T, U> {
        final Function<? super T, ? extends U> mapper;

        MapObserver(Observer<? super U> actual, Function<? super T, ? extends U> mapper) {
            // 把下游的Observer 保存在downstream 中
            super(actual);
            // 保存map 變換操作
            this.mapper = mapper;
        }

        // 本例中,onNext 是在emitter.onNext(1) 執行後,調用到這裏的
        @Override
        public void onNext(T t) {
            if (done) {
                return;
            }

            if (sourceMode != NONE) {
                downstream.onNext(null);
                return;
            }
			//目標類型
            U v;

            try {
                // 實現了變化操作,把t 轉爲 v 
                v = ObjectHelper.requireNonNull(mapper.apply(t), "The mapper function returned a null value.");
            } catch (Throwable ex) {
                fail(ex);
                return;
            }
            
            //調用了下游onNext,繼續分發數據,此時的數據是轉換後的目標數據
            downstream.onNext(v);
        }

        @Override
        public int requestFusion(int mode) {
            return transitiveBoundaryFusion(mode);
        }

        @Nullable
        @Override
        public U poll() throws Exception {
            T t = qd.poll();
            return t != null ? ObjectHelper.<U>requireNonNull(mapper.apply(t), "The mapper function returned a null value.") : null;
        }
    }
}

此時再去看看上面的圖,是不是有點感覺了,沒錯,全部都是這個套路,只是每次在裝飾的時候,行爲不一樣

subscribeOn操作符

作用是控制subscribe 的線程,下面來看看subscribeOn 是如何實現的

不仔細看代碼,還以爲作者直接把實現map的代碼拷貝了一份,簡直太相似了

    public final Observable<T> subscribeOn(Scheduler scheduler) {
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        //使用原來的Observable 和調度線程,創建一個新的Observable,就是ObservableSubscribeOn
        return RxJavaPlugins.onAssembly(new ObservableSubscribeOn<T>(this, scheduler));
    }

依舊是創建新的Observable(ObservableSubscribeOn) 和 Observer (SubscribeOnObserver)

public final class ObservableSubscribeOn<T> extends AbstractObservableWithUpstream<T, T> {
    final Scheduler scheduler;

    public ObservableSubscribeOn(ObservableSource<T> source, Scheduler scheduler) {
        // 依舊是保存了上游 ObservableSource
        super(source);
        // 保存了線程調度的Scheduler 
        this.scheduler = scheduler;
    }

    @Override
    public void subscribeActual(final Observer<? super T> observer) {
        // 使用裝飾着模式,把原來的Observer 封裝了一層
        final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(observer);

		//注意,這裏還沒有切換新城,調用了onSubscribe
        observer.onSubscribe(parent);
		//這裏是重點,
		//scheduler.scheduleDirect(new SubscribeTask(parent))   在新線程中執行parent,
		//parent.setDisposable  把新線程任務,加入到DisposableHelper,如果手動dispose後,保證線程可以停止
        parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));
    }

    static final class SubscribeOnObserver<T> extends AtomicReference<Disposable> implements Observer<T>, Disposable {

        private static final long serialVersionUID = 8094547886072529208L;
        final Observer<? super T> downstream;

        final AtomicReference<Disposable> upstream;

        SubscribeOnObserver(Observer<? super T> downstream) {
            this.downstream = downstream;
            this.upstream = new AtomicReference<Disposable>();
        }

        @Override
        public void onSubscribe(Disposable d) {
            DisposableHelper.setOnce(this.upstream, d);
        }

       // 下面的常規操作方法,就是調用downstream  的各個操作方法
        @Override
        public void onNext(T t) {
            downstream.onNext(t);
        }

        @Override
        public void onError(Throwable t) {
            downstream.onError(t);
        }

        @Override
        public void onComplete() {
            downstream.onComplete();
        }

        @Override
        public void dispose() {
            DisposableHelper.dispose(upstream);
            DisposableHelper.dispose(this);
        }

        @Override
        public boolean isDisposed() {
            return DisposableHelper.isDisposed(get());
        }

        void setDisposable(Disposable d) {
           //把當前
            DisposableHelper.setOnce(this, d);
        }
    }

    // 實現了線程的Runnable 接口,目的是讓線程可以調度
    final class SubscribeTask implements Runnable {
        private final SubscribeOnObserver<T> parent;

        SubscribeTask(SubscribeOnObserver<T> parent) {
            this.parent = parent;
        }

        @Override
        public void run() {
            // 會在新的線程中調用,source是上游的Observable
            source.subscribe(parent);
        }
    }
}

截止到這裏,subscribeOn總體的邏輯已經,搞清楚了,再深入一點看一下scheduler.scheduleDirect(new SubscribeTask(parent)) 是如何實現線程切換的

    @NonNull
    public Disposable scheduleDirect(@NonNull Runnable run) {
        //調用scheduleDirect,參數表示立即執行
        return scheduleDirect(run, 0L, TimeUnit.NANOSECONDS);
    }

    @NonNull
    public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
        //創建了一個worker,注意這裏的createWorker(),是一個抽象方法,不同的線程,創建的worker 不一樣。
        // 例如:Schedulers.io()  創建的是 EventLoopWorker
        final Worker w = createWorker();

        // 依舊是切面編程,對每個切換線程的, 包裹一層
        final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);
		//把worker 和 Runnable  封裝成DisposeTask ,方便外界調用disposed,來停止它的運行
        DisposeTask task = new DisposeTask(decoratedRun, w);
		//立即開始執行
        w.schedule(task, delay, unit);

        return task;
    }

在深入看一下上面的DisposeTask,是如何封裝的。

這段代碼,我多說一句,你都會嫌我囉嗦

    static final class DisposeTask implements Disposable, Runnable, SchedulerRunnableIntrospection {

        @NonNull
        final Runnable decoratedRun;

        @NonNull
        final Worker w;

        @Nullable
        Thread runner;

        DisposeTask(@NonNull Runnable decoratedRun, @NonNull Worker w) {
            this.decoratedRun = decoratedRun;
            this.w = w;
        }

        @Override
        public void run() {
            runner = Thread.currentThread();
            try {
                decoratedRun.run();
            } finally {
                dispose();
                runner = null;
            }
        }

        @Override
        public void dispose() {
            if (runner == Thread.currentThread() && w instanceof NewThreadWorker) {
                ((NewThreadWorker)w).shutdown();
            } else {
                w.dispose();
            }
        }

        @Override
        public boolean isDisposed() {
            return w.isDisposed();
        }

        @Override
        public Runnable getWrappedRunnable() {
            return this.decoratedRun;
        }
    }

總結:

現在你再結合上圖來理解一下,是不是瞬間感覺,WC,這麼簡單的代碼,也有人寫博客發佈

懂了subscribeOn的源碼,那麼想想,大家經常討論的多個subscribeOn 調用,線程切換的問題,兩句話。

  1. subscribeOn 對上游訂閱有效
  2. 最上面的subscribeOn 對發送數據有效

observeOn操作符

控制 onNextonComplete 等數據消費方法的線程,

下面的分析略有差異,但總體和上面還是一樣的,你也可以自行read fuck source code ,相信你的印象會更加深刻

    public final Observable<T> observeOn(Scheduler scheduler) {
        //爲什麼這裏,有bufferSize()
        //這就是Rxjava 2 所添加背壓的概念,rxjava 1  會有一個問題,就是如果上游一直髮送數據onNext ,拼命的調用,
        // 但是onNext() 處理的不夠快,就會出現棧溢出。這個bufferSize 就是控制了,緩衝區的大小
        return observeOn(scheduler, false, bufferSize());
    }

    public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
        ObjectHelper.requireNonNull(scheduler, "scheduler is null");
        ObjectHelper.verifyPositive(bufferSize, "bufferSize");
        //重點ObservableObserveOn
        return RxJavaPlugins.onAssembly(new ObservableObserveOn<T>(this, scheduler, delayError, bufferSize));
    }

創建新的Observable (ObservableObserveOn) 和 Observer(ObserveOnObserver)

public final class ObservableObserveOn<T> extends AbstractObservableWithUpstream<T, T> {
    final Scheduler scheduler;
    final boolean delayError;
    final int bufferSize;
    public ObservableObserveOn(ObservableSource<T> source, Scheduler scheduler, boolean delayError, int bufferSize) {
        //保存上游Observable 
        super(source);
        //保存調度線程
        this.scheduler = scheduler;
        //
        this.delayError = delayError;
        //緩衝區
        this.bufferSize = bufferSize;
    }

    @Override
    protected void subscribeActual(Observer<? super T> observer) {
        //TrampolineScheduler 官方文檔的解釋  * Schedules work on the current thread but does not execute immediately. Work is put in a queue and executed after the current unit of work is completed.
        if (scheduler instanceof TrampolineScheduler) {
            source.subscribe(observer);
        } else {
            // 創建一個worker,線程的調度就是在這裏
            Scheduler.Worker w = scheduler.createWorker();
			// 因爲observeOn 是控制處理數據的線程,所以在訂閱的時候,不去切換線程
			// 把線程worker,緩衝區,下游observer  都都封裝進ObserveOnObserver ,等到onSubscribe,onNext 調用到來是,在去切換線程去處理
            source.subscribe(new ObserveOnObserver<T>(observer, w, delayError, bufferSize));
        }
    }
    
     ...   省略 ObserveOnObserver 代碼 ...
}

上面關於 TrampolineScheduler 可以查看這篇文章

下面來看一下 ObserveOnObserver

    static final class ObserveOnObserver<T> extends BasicIntQueueDisposable<T>
    implements Observer<T>, Runnable {

        private static final long serialVersionUID = 6576896619930983584L;
        final Observer<? super T> downstream;
        final Scheduler.Worker worker;
        final boolean delayError;
        final int bufferSize;

        SimpleQueue<T> queue;

        Disposable upstream;

        Throwable error;
        volatile boolean done;

        volatile boolean disposed;

        int sourceMode;

        boolean outputFused;

        ObserveOnObserver(Observer<? super T> actual, Scheduler.Worker worker, boolean delayError, int bufferSize) {
            this.downstream = actual;
            this.worker = worker;
            this.delayError = delayError;
            this.bufferSize = bufferSize;
        }


        @Override
        public void onSubscribe(Disposable d) {
            if (DisposableHelper.validate(this.upstream, d)) {
                this.upstream = d;
				// 上游的Observer 被封裝成了QueueDisposable,那麼使用這裏面的sourceMode ,queue  等信息
                if (d instanceof QueueDisposable) {
                    @SuppressWarnings("unchecked")
                    QueueDisposable<T> qd = (QueueDisposable<T>) d;

                    int m = qd.requestFusion(QueueDisposable.ANY | QueueDisposable.BOUNDARY);

                    if (m == QueueDisposable.SYNC) {
                        sourceMode = m;
                        queue = qd;
                        done = true;
                        downstream.onSubscribe(this);
                        schedule();
                        return;
                    }
                    if (m == QueueDisposable.ASYNC) {
                        sourceMode = m;
                        queue = qd;
                        downstream.onSubscribe(this);
                        return;
                    }
                }
				//大多數情況會到這裏創建一個隊列,使用指定的緩衝區
                queue = new SpscLinkedArrayQueue<T>(bufferSize);

                downstream.onSubscribe(this);
            }
        }

        @Override
        public void onNext(T t) {
            //執行過error / complete 會是true
            if (done) {
                return;
            }
			//如果不是異步的,就把數據放到隊列中
            if (sourceMode != QueueDisposable.ASYNC) {
                queue.offer(t);
            }
            //開始執行
            schedule();
        }

        @Override
        public void onError(Throwable t) {
            if (done) {
                RxJavaPlugins.onError(t);
                return;
            }
            error = t;
            done = true;
            schedule();
        }

        @Override
        public void onComplete() {
            if (done) {
                return;
            }
            done = true;
            schedule();
        }

        @Override
        public void dispose() {
            if (!disposed) {
                // 結束運行
                disposed = true;
                upstream.dispose();
                worker.dispose();
                if (getAndIncrement() == 0) {
                    queue.clear();
                }
            }
        }

        @Override
        public boolean isDisposed() {
            return disposed;
        }

        void schedule() {
            //該類繼承了,AtomicInteger,多線程下保證worker值開啓一個線程
            //有可能調用onNext 是在不同的線程
            if (getAndIncrement() == 0) {
                // this 是一個Runable 接口,在新線程中執行
                worker.schedule(this);
            }
        }

        void drainNormal() {
            int missed = 1;

            final SimpleQueue<T> q = queue;
            final Observer<? super T> a = downstream;

            for (;;) {
                //判斷是否需要結束
                if (checkTerminated(done, q.isEmpty(), a)) {
                    return;
                }

                for (;;) {
                    boolean d = done;
                    T v;

                    try {
                       //隊列中取出一個數據
                        v = q.poll();
                    } catch (Throwable ex) {
                        Exceptions.throwIfFatal(ex);
                        disposed = true;
                        upstream.dispose();
                        q.clear();
                        a.onError(ex);
                        worker.dispose();
                        return;
                    }
                    boolean empty = v == null;
                    //判斷是否需要結束
                    if (checkTerminated(d, empty, a)) {
                        return;
                    }
					//隊列是否爲空
                    if (empty) {
                        break;
                    }
					//發送數據給下游
                    a.onNext(v);
                }

                missed = addAndGet(-missed);
                if (missed == 0) {
                    break;
                }
            }
        }

        void drainFused() {
            int missed = 1;

            for (;;) {
                if (disposed) {
                    return;
                }

                boolean d = done;
                Throwable ex = error;

                if (!delayError && d && ex != null) {
                    disposed = true;
                    downstream.onError(error);
                    worker.dispose();
                    return;
                }

                downstream.onNext(null);

                if (d) {
                    disposed = true;
                    ex = error;
                    if (ex != null) {
                        downstream.onError(ex);
                    } else {
                        downstream.onComplete();
                    }
                    worker.dispose();
                    return;
                }

                missed = addAndGet(-missed);
                if (missed == 0) {
                    break;
                }
            }
        }

		//上面work.schedule(this) 後,會執行這裏
        @Override
        public void run() {
            if (outputFused) {
                //這裏是有關背壓的,暫時先不講解
                drainFused();
            } else {
                drainNormal();
            }
        }

        boolean checkTerminated(boolean d, boolean empty, Observer<? super T> a) {
            if (disposed) {
                queue.clear();
                return true;
            }
            // 是否已經完成
            if (d) {
                Throwable e = error;
                //是否分發Error
                if (delayError) {
                   //隊列是否爲空
                    if (empty) {
                        disposed = true;
                        //是否有錯誤信息
                        if (e != null) {
                            a.onError(e);
                        } else {
                            a.onComplete();
                        }
                        worker.dispose();
                        return true;
                    }
                } else {
                    if (e != null) {
                        disposed = true;
                        queue.clear();
                        a.onError(e);
                        worker.dispose();
                        return true;
                    } else
                    if (empty) {
                        disposed = true;
                        a.onComplete();
                        worker.dispose();
                        return true;
                    }
                }
            }
            return false;
        }

        @Override
        public int requestFusion(int mode) {
           // 這部分也與背壓有關,暫時不展開
            if ((mode & ASYNC) != 0) {
                outputFused = true;
                return ASYNC;
            }
            return NONE;
        }

        @Nullable
        @Override
        public T poll() throws Exception {
            return queue.poll();
        }

        @Override
        public void clear() {
            queue.clear();
        }

        @Override
        public boolean isEmpty() {
            return queue.isEmpty();
        }
    }
}

總結:

到這裏應該對observeOn 也一定的瞭解,多個observeOn 嵌套的問題,一句話,只對下游的Observer有效。再結合上圖的流程,subscribeOn 和 observeOn 胡亂嵌套,都能理清楚了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章