【RxJava】observeOn源码解析

315 阅读1分钟

小栗子

Observable.just(1)
        .observeOn(Schedulers.newThread())
        .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                // 1
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                // 2
            }

            @Override
            public void onError(@NonNull Throwable e) {
                // 3
            }

            @Override
            public void onComplete() {
                // 4
            }
        });

observeOn

observeOn原型如下

public final Observable<T> observeOn(Scheduler scheduler) {
    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");
    return RxJavaPlugins.onAssembly(new ObservableObserveOn<T>(this, scheduler, delayError, bufferSize));
}

observeOn返回一个ObservableObserveOn对象

ObserveOnObserver#subscribe

public final void subscribe(Observer<? super T> observer) {
    ...
    subscribeActual(observer);
    ...
}

subscribe方法调用ObservableObserveOn的subscribeActual方法

ObserveOnObserver#subscribeActual

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

注释1处使用scheduler的createWorker方法创建一个Scheduler.Worker,以后说。

注释2进行了订阅,且未发生线程切换。

ObservableJust#subscribeActual

protected void subscribeActual(Observer<? super T> observer) {
    ScalarDisposable<T> sd = new ScalarDisposable<T>(observer, value);
    observer.onSubscribe(sd);
    sd.run();
}

subscribeActual调用onSubscribe方法。

ObserveOnObserver#onSubscribe

@Override
public void onSubscribe(Disposable d) {
    if (DisposableHelper.validate(this.upstream, d)) {
        this.upstream = d;
        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;
                // 1
                downstream.onSubscribe(this);
                schedule();
                return;
            }
            if (m == QueueDisposable.ASYNC) {
                sourceMode = m;
                queue = qd;
                // 2
                downstream.onSubscribe(this);
                return;
            }
        }

        queue = new SpscLinkedArrayQueue<T>(bufferSize);
        // 3
        downstream.onSubscribe(this);
    }
}

注释123处在调用onSubscribe方法时均未发生线程切换。

注:在我们的例子中走的是注释1处的代码。

ObserveOnObserver#schedule

void schedule() {
    if (getAndIncrement() == 0) {
        worker.schedule(this);
    }
}

@Override
public void run() {
    if (outputFused) {
        drainFused();
    } else {
        drainNormal();
    }
}

调度后,执行run方法.

ObserveOnObserver#drainNormal

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;
            }

            // 1
            a.onNext(v);
        }

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

注释1处调用了onNext

ObserveOnObserver#checkTerminated

boolean checkTerminated(boolean d, boolean empty, Observer<? super T> a) {
    if (disposed) {
        queue.clear();
        return true;
    }
    if (d) {
        Throwable e = 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;
                // 1
                a.onComplete();
                worker.dispose();
                return true;
            }
        }
    }
    return false;
}

注释1处调用了onComplete