RxJava源码分析

RxJava源码分析

预备知识

给 Android 开发者的 RxJava 详解
深入浅出RxJava(一:基础篇)

主流程

分析的版本:

compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.6'

从调用开始分析,先来一段的代码

        Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("");
                Log.e("Observable Thread id ", ""+ Thread.currentThread().getId());
            }
        }).subscribeOn(Schedulers.io()).doOnSubscribe(new Action0() {
            @Override
            public void call() {
                Log.e("doOnSubscribe Thread id", ""+ Thread.currentThread().getId());
            }
        }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.e("Subscriber Thread id", ""+ Thread.currentThread().getId());
            }
        });

先分析Observable.create()源码如下:

public static <T> Observable<T> create(OnSubscribe<T> f) {
    return new Observable<T>(hook.onCreate(f));
}
protected Observable(OnSubscribe<T> f) {
    this.onSubscribe = f;
}

Observable.create()实际就是创建了一个Observable对象,并且这个对象的onSubscribe对象被赋值为我们new的onSubscribe。(hook.onCreate()什么都没干直接返回传入的参数)

假设创建的Observable对象为A,那么如下图

这里写图片描述

接下来A又调用了subscribeOn(Schedulers.io()),先来分析subscribeOn的源码

    public final Observable<T> subscribeOn(Scheduler scheduler) {
        if (this instanceof ScalarSynchronousObservable) {
            return ((ScalarSynchronousObservable<T>)this).scalarScheduleOn(scheduler);
        }
        return create(new OperatorSubscribeOn<T>(this, scheduler));
    }

subscribeOn里面又调用了Observable.create创建返回了一个新的Observable对象,注意此时this是A,假设新创建的对象为B,那么如下图:

这里写图片描述

接着B又调用了doOnSubscribe

    public final Observable<T> doOnSubscribe(final Action0 subscribe) {
        return lift(new OperatorDoOnSubscribe<T>(subscribe));
    }
    public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
        return new Observable<R>(new OnSubscribeLift<T, R>(onSubscribe, operator));
    }

doOnSubscribe里面调用了lift创建了一个新的Observable对象,注意new OnSubscribeLift中传入的onSubscribe为B对象的onSubscribe,假设新创建的对象为C,如下图

这里写图片描述

接着C对象又调用了observeOn(AndroidSchedulers.mainThread())

    public final Observable<T> observeOn(Scheduler scheduler) {
        return observeOn(scheduler, RxRingBuffer.SIZE);
    }
    public final Observable<T> observeOn(Scheduler scheduler, int bufferSize) {
        return observeOn(scheduler, false, bufferSize);
    }
    public final Observable<T> observeOn(Scheduler scheduler, boolean delayError, int bufferSize) {
        if (this instanceof ScalarSynchronousObservable) {
            return ((ScalarSynchronousObservable<T>)this).scalarScheduleOn(scheduler);
        }
        return lift(new OperatorObserveOn<T>(scheduler, delayError, bufferSize));
    }

observeOn中又调用了lift函数创建了一个新的Observable对象,注意new OnSubscribeLift中传入的onSubscribe为C对象的onSubscribe,假设新创建的对象为D,如下图

这里写图片描述

最后D调用subscribe,传入的参数为

new Subscriber<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.e("Subscriber Thread id", ""+ Thread.currentThread().getId());
            }
        }

假设传入的Subscriber对象为subscriber_org

接下来看 subscribe的源码

    public final Subscription subscribe(Subscriber<? super T> subscriber) {
        return Observable.subscribe(subscriber, this);
    }
    static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
     // validate and proceed
        if (subscriber == null) {
            throw new IllegalArgumentException("subscriber can not be null");
        }
        if (observable.onSubscribe == null) {
            throw new IllegalStateException("onSubscribe function can not be null.");
            /*
             * the subscribe function can also be overridden but generally that's not the appropriate approach
             * so I won't mention that in the exception
             */
        }

        // new Subscriber so onStart it
        subscriber.onStart();

        /*
         * See https://github.com/ReactiveX/RxJava/issues/216 for discussion on "Guideline 6.4: Protect calls
         * to user code from within an Observer"
         */
        // if not already wrapped
        if (!(subscriber instanceof SafeSubscriber)) {
            // assign to `observer` so we return the protected version
            subscriber = new SafeSubscriber<T>(subscriber);
        }

        // The code below is exactly the same an unsafeSubscribe but not used because it would 
        // add a significant depth to already huge call stacks.
        try {
            // allow the hook to intercept and/or decorate
            hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
            return hook.onSubscribeReturn(subscriber);
        } catch (Throwable e) {
            // special handling for certain Throwable/Error/Exception types
            Exceptions.throwIfFatal(e);
            // in case the subscriber can't listen to exceptions anymore
            if (subscriber.isUnsubscribed()) {
                RxJavaPluginUtils.handleException(hook.onSubscribeError(e));
            } else {
                // if an unhandled error occurs executing the onSubscribe we will propagate it
                try {
                    subscriber.onError(hook.onSubscribeError(e));
                } catch (Throwable e2) {
                    Exceptions.throwIfFatal(e2);
                    // if this happens it means the onError itself failed (perhaps an invalid function implementation)
                    // so we are unable to propagate the error correctly and will just throw
                    RuntimeException r = new OnErrorFailedException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);
                    // TODO could the hook be the cause of the error in the on error handling.
                    hook.onSubscribeError(r);
                    // TODO why aren't we throwing the hook's return value.
                    throw r;
                }
            }
            return Subscriptions.unsubscribed();
        }
    }

先看前面两个if判断,subscriber为我们new出来的对象不为null,observable为对象D,D.onSubscribe不为null,所以再往下看

 subscriber.onStart();

调用subscribe就会马上回调到subscriber的onStart(),onStart执行是在调用subscribe的线程,如果在子线程调用subscribe,那么onStart也会在子线程调用。 so当我们请求网络之前显示时候 ,显示加载的动画放在onStart里面是可以的,但是调用subscribe的线程必须是主线程。如果想在子线程调用subscribe,但是又想在请求发生之前在主线程做什么事的话,onStart是满足不了的,可以使用doOnSubscribe(里面显示加载动画)结合subscribeOn。

接下来

        if (!(subscriber instanceof SafeSubscriber)) {
            // assign to `observer` so we return the protected version
            subscriber = new SafeSubscriber<T>(subscriber);
        }

subscriber被封装成SafeSubscriber的对象,SafeSubscriber相当于Subscriber的安全版本,多了一些安全判断。在这里认为没有被封装就好。

再往下

            hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);

hook.onSubscribeStart什么都没干直接返回了observable.onSubscribe,这里的observable.onSubscribe为D对象的onSubscribe,而D的onSubscribe为new OnSubscribeLift(C.onSubscribe, new OperatorObserveOn(scheduler, delayError, bufferSize)),接着调用了D.onSubscribe的call方法,即OnSubscribeLift.call

那么先分析OnSubscribeLift.call

    public OnSubscribeLift(OnSubscribe<T> parent, Operator<? extends R, ? super T> operator) {
        this.parent = parent;
        this.operator = operator;
    }

    @Override
    public void call(Subscriber<? super R> o) {
        try {
            Subscriber<? super T> st = hook.onLift(operator).call(o);
            try {
                // new Subscriber created and being subscribed with so 'onStart' it
                st.onStart();
                parent.call(st);
            } catch (Throwable e) {
                // localized capture of errors rather than it skipping all operators 
                // and ending up in the try/catch of the subscribe method which then
                // prevents onErrorResumeNext and other similar approaches to error handling
                Exceptions.throwIfFatal(e);
                st.onError(e);
            }
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            // if the lift function failed all we can do is pass the error to the final Subscriber
            // as we don't have the operator available to us
            o.onError(e);
        }
    }

先调用了hook.onLift(operator).call(o),hook.onLift什么都干直接返回了operator,而此时的operator为OperatorObserveOn,那么再看OperatorObserveOn的call

    public Subscriber<? super T> call(Subscriber<? super T> child) {
        if (scheduler instanceof ImmediateScheduler) {
            // avoid overhead, execute directly
            return child;
        } else if (scheduler instanceof TrampolineScheduler) {
            // avoid overhead, execute directly
            return child;
        } else {
            ObserveOnSubscriber<T> parent = new ObserveOnSubscriber<T>(scheduler, child, delayError, bufferSize);
            parent.init();
            return parent;
        }
    }

call里面创建返回了一个ObserveOnSubscriber对象,并且把subscriber_org赋值给了ObserveOnSubscriber对象的child成员,ObserveOnSubscriber继承Subscriber。假设这个ObserveOnSubscriber为subscriber_D,那么如图

这里写图片描述

然后回到OnSubscribeLift.call中

st.onStart();

st为subscriber_D对象,即调用subscriber_D.onStart

接着往下看

parent.call(st);

此时的parent为C.onSubscribe,而C.onSubscribe为onSubscribe = new OnSubscribeLift(B.onSubscribe , new OperatorDoOnSubscribe(Action0))。那么再看OnSubscribeLift.call

    @Override
    public void call(Subscriber<? super R> o) {
        try {
            Subscriber<? super T> st = hook.onLift(operator).call(o);
            try {
                // new Subscriber created and being subscribed with so 'onStart' it
                st.onStart();
                parent.call(st);
            } catch (Throwable e) {
                // localized capture of errors rather than it skipping all operators 
                // and ending up in the try/catch of the subscribe method which then
                // prevents onErrorResumeNext and other similar approaches to error handling
                Exceptions.throwIfFatal(e);
                st.onError(e);
            }
        } catch (Throwable e) {
            Exceptions.throwIfFatal(e);
            // if the lift function failed all we can do is pass the error to the final Subscriber
            // as we don't have the operator available to us
            o.onError(e);
        }
    }

先看

Subscriber<? super T> st = hook.onLift(operator).call(o);

operator为OperatorDoOnSubscribe类型,那么再看OperatorDoOnSubscribe.call

    public Subscriber<? super T> call(final Subscriber<? super T> child) {
        subscribe.call();
        // Pass through since this operator is for notification only, there is
        // no change to the stream whatsoever.
        return Subscribers.wrap(child);
    }

先是调用subscribe.call(),而这里的subscribe为我们传入的new Aciton0对象

new Action0() {
            @Override
            public void call() {
                Log.e("doOnSubscribe Thread id", ""+ Thread.currentThread().getId());
            }
        }

接着Subscribers.wrap(child)又创建了一个Subscriber对象(回调的时候直接透传过去,没有的任何处理)

   public static <T> Subscriber<T> wrap(final Subscriber<? super T> subscriber) {
        return new Subscriber<T>(subscriber) {

            @Override
            public void onCompleted() {
                subscriber.onCompleted();
            }

            @Override
            public void onError(Throwable e) {
                subscriber.onError(e);
            }

            @Override
            public void onNext(T t) {
                subscriber.onNext(t);
            }

        };
    }

假设这个Subscriber对象为subscriber_C,那么如图

这里写图片描述

再回到OnSubscribeLift.call中

                st.onStart();
                parent.call(st);

此时parent为B.onSubscribe,而B.onSubscribe = new OperatorSubscribeOn(A, scheduler),那么再看OperatorSubscribeOn.call

    public void call(final Subscriber<? super T> subscriber) {
        final Worker inner = scheduler.createWorker();
        subscriber.add(inner);

        inner.schedule(new Action0() {
            @Override
            public void call() {
                final Thread t = Thread.currentThread();

                Subscriber<T> s = new Subscriber<T>(subscriber) {
                    @Override
                    public void onNext(T t) {
                        subscriber.onNext(t);
                    }

                    @Override
                    public void onError(Throwable e) {
                        try {
                            subscriber.onError(e);
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void onCompleted() {
                        try {
                            subscriber.onCompleted();
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void setProducer(final Producer p) {
                        subscriber.setProducer(new Producer() {
                            @Override
                            public void request(final long n) {
                                if (t == Thread.currentThread()) {
                                    p.request(n);
                                } else {
                                    inner.schedule(new Action0() {
                                        @Override
                                        public void call() {
                                            p.request(n);
                                        }
                                    });
                                }
                            }
                        });
                    }
                };

                source.unsafeSubscribe(s);
            }
        });
    }

先是scheduler(Schedulers.io())创建了一个Worker对象inner,然后inner.schedule(Aciton0)把这个Aciton0加入线程池任务队列(此时Action0里面的call将在子线程执行),然后就返回到OnSubscribeLift.call,没异常就一直到返回到subscribe,然后执行
return hook.onSubscribeReturn(subscriber); 而里面什么都没干直接返回了subscriber,即subscriber_D

接下来分析Action0的call函数

new Action0() {
            @Override
            public void call() {
                final Thread t = Thread.currentThread();

                Subscriber<T> s = new Subscriber<T>(subscriber) {
                    @Override
                    public void onNext(T t) {
                        subscriber.onNext(t);
                    }

                    @Override
                    public void onError(Throwable e) {
                        try {
                            subscriber.onError(e);
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void onCompleted() {
                        try {
                            subscriber.onCompleted();
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void setProducer(final Producer p) {
                        subscriber.setProducer(new Producer() {
                            @Override
                            public void request(final long n) {
                                if (t == Thread.currentThread()) {
                                    p.request(n);
                                } else {
                                    inner.schedule(new Action0() {
                                        @Override
                                        public void call() {
                                            p.request(n);
                                        }
                                    });
                                }
                            }
                        });
                    }
                };

                source.unsafeSubscribe(s);
            }

又创建了一个Subscriber对象,假设为subscriber_B,那么如图
这里写图片描述

接着调用

                source.unsafeSubscribe(s);

此时souce为A对象,s为subscriber_B,A为Observable类型

    public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
        try {
            // new Subscriber so onStart it
            subscriber.onStart();
            // allow the hook to intercept and/or decorate
            hook.onSubscribeStart(this, onSubscribe).call(subscriber);
            return hook.onSubscribeReturn(subscriber);
        } catch (Throwable e) {
            // special handling for certain Throwable/Error/Exception types
            Exceptions.throwIfFatal(e);
            // if an unhandled error occurs executing the onSubscribe we will propagate it
            try {
                subscriber.onError(hook.onSubscribeError(e));
            } catch (Throwable e2) {
                Exceptions.throwIfFatal(e2);
                // if this happens it means the onError itself failed (perhaps an invalid function implementation)
                // so we are unable to propagate the error correctly and will just throw
                RuntimeException r = new RuntimeException("Error occurred attempting to subscribe [" + e.getMessage() + "] and then again while trying to pass to onError.", e2);
                // TODO could the hook be the cause of the error in the on error handling.
                hook.onSubscribeError(r);
                // TODO why aren't we throwing the hook's return value.
                throw r;
            }
            return Subscriptions.unsubscribed();
        }
    }

先看

            subscriber.onStart();

这里的subscriber为subscriber_B

接着往下

hook.onSubscribeStart(this, onSubscribe).call(subscriber);

相当于调用A.onSubscribe.call(subscriber_B),而A.onSubscribe为

new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("");
                Log.e("Observable Thread id ", ""+ Thread.currentThread().getId());
            }
        }

先看

subscriber.onNext("");

相当于调用subscriber_B.onNext,而subscriber_B.onNext则会调用subscriber_C.onNext,而subscriber_C.onNext则会调用subscriber_D.onNext,注意此时是在子线程执行。subscriber_D为ObserveOnSubscriber类型,那么接着看ObserveOnSubscriber的onNext

        @Override
        public void onNext(final T t) {
            if (isUnsubscribed() || finished) {
                return;
            }
            if (!queue.offer(on.next(t))) {
                onError(new MissingBackpressureException());
                return;
            }
            schedule();
        }

接着看schedule()

        protected void schedule() {
            if (counter.getAndIncrement() == 0) {
                recursiveScheduler.schedule(this);
            }
        }

recursiveScheduler为Worker对象,recursiveScheduler.schedule(this)会把ObserveOnSubscriber.call放到主线程执行,那么接着看call函数

       @Override
        public void call() {
            long missed = 1L;
            long currentEmission = emitted;

            // these are accessed in a tight loop around atomics so
            // loading them into local variables avoids the mandatory re-reading
            // of the constant fields
            final Queue<Object> q = this.queue;
            final Subscriber<? super T> localChild = this.child;
            final NotificationLite<T> localOn = this.on;

            // requested and counter are not included to avoid JIT issues with register spilling
            // and their access is is amortized because they are part of the outer loop which runs
            // less frequently (usually after each bufferSize elements)

            for (;;) {
                long requestAmount = requested.get();

                while (requestAmount != currentEmission) {
                    boolean done = finished;
                    Object v = q.poll();
                    boolean empty = v == null;

                    if (checkTerminated(done, empty, localChild, q)) {
                        return;
                    }

                    if (empty) {
                        break;
                    }

                    localChild.onNext(localOn.getValue(v));

                    currentEmission++;
                    if (currentEmission == limit) {
                        requestAmount = BackpressureUtils.produced(requested, currentEmission);
                        request(currentEmission);
                        currentEmission = 0L;
                    }
                }

                if (requestAmount == currentEmission) {
                    if (checkTerminated(finished, q.isEmpty(), localChild, q)) {
                        return;
                    }
                }

                emitted = currentEmission;
                missed = counter.addAndGet(-missed);
                if (missed == 0L) {
                    break;
                }
            }
        }

直接看

localChild.onNext(localOn.getValue(v));

localChild为subscriber_org对象。

            @Override
            public void onNext(String s) {
                Log.e("Subscriber Thread id", ""+ Thread.currentThread().getId());
            }

看到这里整个主流程已走通,来个示意图

这里写图片描述

subscribeOn是在Observable.onSubscribe中完成线程切换,subscribeOn切换处于subscribeOn之前的调用链执行线程,so当多次subscribeOn调用的时候,只有最开始的subscribeOn有效。

observeOn是在subscriber对象中完成线程切换,observeOn切换处于observeOn之后的调用链执行线程。

doOnSubscribe默认发生在调用的subscribe线程。如果doOnSubscribe之后的调用链上有subscribeOn,那么doOnSubscribe的执行在subscribeOn切换的线程中(注意 doOnSubscribe之前的调用链上的subscribeOn不影响的doOnSubscribe)

线程相关

AndroidSchedulers.mainThread()
observeOn(AndroidSchedulers.mainThread())
    public static Scheduler mainThread() {
        return getInstance().mainThreadScheduler;
    }
    private AndroidSchedulers() {
        RxAndroidSchedulersHook hook = RxAndroidPlugins.getInstance().getSchedulersHook();

        Scheduler main = hook.getMainThreadScheduler();
        if (main != null) {
            mainThreadScheduler = main;
        } else {
            mainThreadScheduler = new LooperScheduler(Looper.getMainLooper());
        }
    }
    LooperScheduler(Looper looper) {
        handler = new Handler(looper);
    }

observeOn中传入LooperScheduler对象,LooperScheduler构造函数中用主线程looper创建了一个handler。

observeOn线程切换是在ObserveOnSubscriber中完成的

 this.recursiveScheduler = scheduler.createWorker();
    @Override
    public Worker createWorker() {
        return new HandlerWorker(handler);
    }

scheduler为LooperScheduler对象,createWorker则会创建一个HandlerWorker对象

        protected void schedule() {
            if (counter.getAndIncrement() == 0) {
                recursiveScheduler.schedule(this);
            }
        }
        @Override
        public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) {
            if (unsubscribed) {
                return Subscriptions.unsubscribed();
            }

            action = hook.onSchedule(action);

            ScheduledAction scheduledAction = new ScheduledAction(action, handler);

            Message message = Message.obtain(handler, scheduledAction);
            message.obj = this; // Used as token for unsubscription operation.

            handler.sendMessageDelayed(message, unit.toMillis(delayTime));

            if (unsubscribed) {
                handler.removeCallbacks(scheduledAction);
                return Subscriptions.unsubscribed();
            }

            return scheduledAction;
        }
        ScheduledAction(Action0 action, Handler handler) {
            this.action = action;
            this.handler = handler;
        }

recursiveScheduler.schedule(this)中this为ObserveOnSubscriber对象,那么action为ObserveOnSubscriber对象。

接着创建了一个ScheduledAction对象。接着封装到message对象,并加入handler的MessageQueue中。
那么主线程会执行ScheduledAction的run方法

        @Override public void run() {
            try {
                action.call();
            } catch (Throwable e) {
                // nothing to do but print a System error as this is fatal and there is nowhere else to throw this
                IllegalStateException ie;
                if (e instanceof OnErrorNotImplementedException) {
                    ie = new IllegalStateException("Exception thrown on Scheduler.Worker thread. Add `onError` handling.", e);
                } else {
                    ie = new IllegalStateException("Fatal Exception thrown on Scheduler.Worker thread.", e);
                }
                RxJavaPlugins.getInstance().getErrorHandler().handleError(ie);
                Thread thread = Thread.currentThread();
                thread.getUncaughtExceptionHandler().uncaughtException(thread, ie);
            }
        }

而run里面又调用action.call(),而action为ObserveOnSubscriber为对象,相当于调用ObserveOnSubscriber的call方法

        @Override
        public void call() {

                    ......

                    localChild.onNext(localOn.getValue(v));

                   ......

        }

localChild为subscribe传入的参数(subscribe_org)。那么subscribe_org.onNext将会在主线程执行。

Schedulers.io()
subscribeOn(Schedulers.io())
    public void call(final Subscriber<? super T> subscriber) {
        final Worker inner = scheduler.createWorker();
        subscriber.add(inner);

        inner.schedule(new Action0() {
            @Override
            public void call() {
                final Thread t = Thread.currentThread();

                Subscriber<T> s = new Subscriber<T>(subscriber) {
                    @Override
                    public void onNext(T t) {
                        subscriber.onNext(t);
                    }

                    @Override
                    public void onError(Throwable e) {
                        try {
                            subscriber.onError(e);
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void onCompleted() {
                        try {
                            subscriber.onCompleted();
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void setProducer(final Producer p) {
                        subscriber.setProducer(new Producer() {
                            @Override
                            public void request(final long n) {
                                if (t == Thread.currentThread()) {
                                    p.request(n);
                                } else {
                                    inner.schedule(new Action0() {
                                        @Override
                                        public void call() {
                                            p.request(n);
                                        }
                                    });
                                }
                            }
                        });
                    }
                };

                source.unsafeSubscribe(s);
            }
        });
    }

同样Schedulers.io()调用createWorker创建了一个worker对象。然后worker调用schedule把action0加入到线程池中执行,Schedulers.io()实际是一个CachedThreadScheduler对象

    public CachedThreadScheduler(ThreadFactory threadFactory) {
        this.threadFactory = threadFactory;
        this.pool = new AtomicReference<CachedWorkerPool>(NONE);
        start();
    }

    @Override
    public void start() {
        CachedWorkerPool update =
            new CachedWorkerPool(threadFactory, KEEP_ALIVE_TIME, KEEP_ALIVE_UNIT);
        if (!pool.compareAndSet(NONE, update)) {
            update.shutdown();
        }
    }

CachedThreadScheduler对象里面创建了一个线程池对象CachedWorkerPool

 @Override
    public Worker createWorker() {
        return new EventLoopWorker(pool.get());
    }

  EventLoopWorker(CachedWorkerPool pool) {
            this.pool = pool;
            this.once = new AtomicBoolean();
            this.threadWorker = pool.get();
        }

而createWorker返回了一个EventLoopWorker对象,EventLoopWorker的threadWorker 则为线程池对象

接着看worker的schedule方法

        @Override
        public Subscription schedule(final Action0 action, long delayTime, TimeUnit unit) {
            if (innerSubscription.isUnsubscribed()) {
                // don't schedule, we are unsubscribed
                return Subscriptions.unsubscribed();
            }

            ScheduledAction s = threadWorker.scheduleActual(new Action0() {
                @Override
                public void call() {
                    if (isUnsubscribed()) {
                        return;
                    }
                    action.call();
                }
            }, delayTime, unit);
            innerSubscription.add(s);
            s.addParent(innerSubscription);
            return s;
        }

里面threadWorker.scheduleActual会把创建Action0加入线程任务队列里面。Action0的call方法将会子线程执行。call里面又调用action.call()

new Action0() {
            @Override
            public void call() {
                final Thread t = Thread.currentThread();

                Subscriber<T> s = new Subscriber<T>(subscriber) {
                    @Override
                    public void onNext(T t) {
                        subscriber.onNext(t);
                    }

                    @Override
                    public void onError(Throwable e) {
                        try {
                            subscriber.onError(e);
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void onCompleted() {
                        try {
                            subscriber.onCompleted();
                        } finally {
                            inner.unsubscribe();
                        }
                    }

                    @Override
                    public void setProducer(final Producer p) {
                        subscriber.setProducer(new Producer() {
                            @Override
                            public void request(final long n) {
                                if (t == Thread.currentThread()) {
                                    p.request(n);
                                } else {
                                    inner.schedule(new Action0() {
                                        @Override
                                        public void call() {
                                            p.request(n);
                                        }
                                    });
                                }
                            }
                        });
                    }
                };

                source.unsafeSubscribe(s);
            }

那么subscribeOn(Schedulers.io())就分析完了

操作符

map
    public final <R> Observable<R> map(Func1<? super T, ? extends R> func) {
        return lift(new OperatorMap<T, R>(func));
    }

  public final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator) {
        return new Observable<R>(new OnSubscribeLift<T, R>(onSubscribe, operator));
    }

map会调用lift方法创建一个新的Observable对象

    @Override
    public Subscriber<? super T> call(final Subscriber<? super R> o) {
        MapSubscriber<T, R> parent = new MapSubscriber<T, R>(o, transformer);
        o.add(parent);
        return parent;
    }

而在调用subscribe后,会调用OperatorMap的call方法返回一个新的Subscriber对象MapSubscriber。

        @Override
        public void onNext(T t) {
            R result;

            try {
                result = mapper.call(t);
            } catch (Throwable ex) {
                Exceptions.throwIfFatal(ex);
                unsubscribe();
                onError(OnErrorThrowable.addValueAsLastCause(ex, t));
                return;
            }

            actual.onNext(result);
        }

而MapSubscriber的onNext中会调用mapper.call(t),mapper为map方法传入的对象(用于转换),actual.onNext(result)传给下一级Subscriber对象,result为转换后的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值