RxJava3 Observable常用api源码解读:

368 阅读13分钟

这篇对Observable常用api方法源码解读,包含just()、fromArray()、empty()、defer()、error()、cache()、timer()、fromCallable()、fromFuture()方法,最后解读一个叫Disposable的状态管理api并做总结。

1、 Observable#just(T)

@CheckReturnValue
@SchedulerSupport("none")
@NonNull
public static <T> Observable<T> just(T item) {
    ObjectHelper.requireNonNull(item, "item is null");
    //创建ObservableJust,订阅后下发onNext事件
    return RxJavaPlugins.onAssembly(new ObservableJust(item));
}

//ObservableJust继承Observable<T>,同样由subscribe()产生订阅
@CheckReturnValue
@SchedulerSupport("none")
public final Disposable subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError, Action onComplete) {
    ObjectHelper.requireNonNull(onNext, "onNext is null");
    ObjectHelper.requireNonNull(onError, "onError is null");
    ObjectHelper.requireNonNull(onComplete, "onComplete is null");
    //创建订阅者LambdaObserver
    LambdaObserver<T> ls = new LambdaObserver(onNext, onError, onComplete, Functions.emptyConsumer());
    
    //实际调用ObservableJust#subscribeActual
    this.subscribe((Observer)ls);
    return ls;
}


public final class ObservableJust<T> extends Observable<T> implements ScalarSupplier<T> {
    private final T value;

    public ObservableJust(T value) {
        this.value = value;
    }

    protected void subscribeActual(Observer<? super T> observer) {
        //通过订阅者和下发的唯一元素创建ScalarDisposable,实现Disposable<T>, Runnable用于控制状态管理以及定义消费逻辑
        ScalarDisposable<T> sd = new ScalarDisposable(observer, this.value);
        
        //产生订阅后执行subscribe()中自定义Consumer<? super Disposable> onSubscribe逻辑
        observer.onSubscribe(sd);
        
        sd.run();
    }

    public T get() {
        return this.value;
    }

}

public void run() {
    if (this.get() == 0 && this.compareAndSet(0, 2)) {
        //回调订阅者observer的Consumer<T> onNext消费元素
        this.observer.onNext(this.value);
        if (this.get() == 2) {
            this.lazySet(3);
            this.observer.onComplete();
        }
    }
 }

2、Observable#empty()

    @CheckReturnValue
    @SchedulerSupport("none")
    public static <T> Observable<T> empty() {
        //public static final Observable<Object> INSTANCE = new ObservableEmpty()创建一个ObservableEmpty对象
        return RxJavaPlugins.onAssembly(ObservableEmpty.INSTANCE);
    }

    再来看subscribeActual()核心方法:
    protected void subscribeActual(Observer<? super Object> o) {
        //
        EmptyDisposable.complete(o);
    }
    
    public static void complete(Observer<?> observer) {
        observer.onSubscribe(INSTANCE);
        
        //直接下发onComplete()事件,发onComplete()事件回调subscribe()中定义的消费onComplete事件逻辑
        observer.onComplete();
    }

3、Observable#fromArray(T... items):

    @CheckReturnValue
    @SchedulerSupport("none")
    @NonNull
    public static <T> Observable<T> fromArray(T... items) {
        ObjectHelper.requireNonNull(items, "items is null");
        //从T... items生产元素下发,如果元素个数为0,直接走empty逻辑,下发onComplete()事件回调订阅者订阅onComplete()事件逻辑
        if (items.length == 0) {
            return empty();
        } else {
            //如果items元素个数为1,走Observable#just(T)
            //否则,创建ObservableFromArray发射元素
            return items.length == 1 ? just(items[0]) : RxJavaPlugins.onAssembly(new ObservableFromArray(items));
        }
    }

    //订阅关键逻辑
    public void subscribeActual(Observer<? super T> observer) {
        //ObservableFromArray:从数组发射元素的Observable
        //FromArrayDisposable:实现Disposable接口,控制状态。生产者只负责生产元素,状态控制单独抽离成Disposable并让订阅者实现该接口从而具有根据状态决定是否取消订阅的能力。d代表订阅者角色。
        ObservableFromArray.FromArrayDisposable<T> d = new ObservableFromArray.FromArrayDisposable(observer, this.array);
        //回调observer onSubscribe(),这个可以根据需要自己实现具体逻辑(默认EmptyConsumer)
        observer.onSubscribe(d);
        if (!d.fusionMode) {
            d.run();
        }
    }
    
    //产生订阅后,执行的消费元素逻辑
    void run() {
        T[] a = this.array;
        int n = a.length;

        for(int i = 0; i < n && !this.isDisposed(); ++i) {
            T value = a[i];
            if (value == null) {
                this.downstream.onError(new NullPointerException("The element at index " + i + " is null"));
                return;
            }
            //遍历数组,回调LambdaObserver#onNext()消费元素
            this.downstream.onNext(value);
        }

        if (!this.isDisposed()) {
            this.downstream.onComplete();
        }
    }

4、Observable#defer(Supplier<? extends ObservableSource<? extends T>> supplier)

@CheckReturnValue
@SchedulerSupport("none")
@NonNull
//defer()方法接收一个Supplier<? extends ObservableSource<? extends T>> supplier,用于生产一个ObservableSource对象,但只有当执行supplier.get(),才会实际创建生产者ObservableSource
public static <T> Observable<T> defer(Supplier<? extends ObservableSource<? extends T>> supplier) {
    ObjectHelper.requireNonNull(supplier, "supplier is null");
    
    //创建ObservableDefer时,传入Supplier<? extends ObservableSource<? extends T>> supplier
    return RxJavaPlugins.onAssembly(new ObservableDefer(supplier));
}

//核心方法,订阅核心逻辑
public void subscribeActual(Observer<? super T> observer) {
    ObservableSource pub;
    try {
        //订阅产生时,才会调用supplier.get(),此时才会真正创建ObservableSource对象ObservableCreate用于发射元素
        pub = (ObservableSource)ObjectHelper.requireNonNull(this.supplier.get(), "The supplier returned a null ObservableSource");
    } catch (Throwable var4) {
        Exceptions.throwIfFatal(var4);
        EmptyDisposable.error(var4, observer);
        return;
    }

    //调用Supplier<? extends ObservableSource<? extends T>>创建的ObservableCreate.subscribe()下发元素,之后的逻辑上篇解读过了,回调订阅者Consumer逻辑消费元素
    pub.subscribe(observer);
}
可以看到defer()会延迟创建生产者发射元素,只有当订阅事件出现时才会真正创建发射器。这个api对于IO资源操作特别有用,比如数据库操作,将数据库操作定义成Lambda表达式只有当订阅真正发生时才会去交互数据库。

5、Observable#error(Supplier<? extends java.lang.Throwable>)

@CheckReturnValue
@SchedulerSupport("none")
@NonNull
public static <T> Observable<T> error(Supplier<? extends Throwable> errorSupplier) {
    ObjectHelper.requireNonNull(errorSupplier, "errorSupplier is null");
    //创建ObservableError用于下发error元素
    return RxJavaPlugins.onAssembly(new ObservableError(errorSupplier));
}

//订阅核心逻辑
public void subscribeActual(Observer<? super T> observer) {
    Throwable error;
    try {
        //订阅事件发生时,真正创建下发error元素的生产者,通过代码可以看到error事件的生产者就是Supplier<? extends Throwable>,下发的元素就是Throwable
        error = (Throwable)ExceptionHelper.nullCheck(this.errorSupplier.get(), "Supplier returned a null Throwable.");
    } catch (Throwable var4) {
        Exceptions.throwIfFatal(var4);
        error = var4;
    }
    
    //消费error元素逻辑
    EmptyDisposable.error(error, observer);
}

//
public static void error(Throwable e, Observer<?> observer) {
    observer.onSubscribe(INSTANCE);
    //回调订阅者消费error事件逻辑
    observer.onError(e);
}

public void onError(Throwable t) {
    if (!this.isDisposed()) {
        this.lazySet(DisposableHelper.DISPOSED);

        try {
            //消费者消费error元素逻辑,即调用在subscribe()中定义的Consumer<? super Throwable> onError
            this.onError.accept(t);
        } catch (Throwable var3) {
            Exceptions.throwIfFatal(var3);
            RxJavaPlugins.onError(new CompositeException(new Throwable[]{t, var3}));
        }
    } else {
        RxJavaPlugins.onError(t);
    }
}

6、Observable#cache()

@CheckReturnValue
@SchedulerSupport("none")
public final Observable<T> cacheWithInitialCapacity(int initialCapacity) {
    ObjectHelper.verifyPositive(initialCapacity, "initialCapacity");
    return RxJavaPlugins.onAssembly(new ObservableCache(this, initialCapacity));
}

abstract class AbstractObservableWithUpstream<T, U> extends Observable<U> implements HasUpstreamObservableSource<T> {
    //引用一个ObservableSource,之前说过ObservableSource类似于一个Consumer,定义一段生产元素的逻辑
    protected final ObservableSource<T> source;

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

    public final ObservableSource<T> source() {
        return this.source;
    }
}


//System#arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length)
//这个方法JDK native方法,从注释说明它用来拷贝源数组到目标数组,给定起始索引和需要拷贝的元素个数
Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array.
 * @param      src      the source array.
 * @param      srcPos   starting position in the source array.
 * @param      dest     the destination array.
 * @param      destPos  starting position in the destination data.
 * @param      length   the number of array elements to be copied.
@HotSpotIntrinsicCandidate
public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);


//先来看ObservableCache类:
//AbstractObservableWithUpstream extends Observable<U>
//类结构上看到,ObservableCache实现了AbstractObservableWithUpstream、Observable、Observer,说明它具有这三个角色的能力
//对于Observer而言,Observable代表一连串流动的数据,结合AbstractObservableWithUpstream,于是ObservableCache同样具备发射元素的能力,对应ObservableCache#onNext(T item)、ObservableCache#onError(Throwable t)、ObservableCache#onComplete()
//Observer代表订阅者,定义消费逻辑,订阅事件发生时消费元素,对应ObservableCache#subscribeActual(Observer<? super T> t)

public final class ObservableCache<T> extends AbstractObservableWithUpstream<T, T> implements Observer<T> {
    //初始化值new AtomicBoolean(),标识首次消费
    final AtomicBoolean once;
    
    //初始化值16
    final int capacityHint;
    
    //初始化值:new ObservableCache.CacheDisposable[0],通过AtomicReference记录了一个ObservableCache.CacheDisposable<T>[]数组的原子引用
    final AtomicReference<ObservableCache.CacheDisposable<T>[]> observers;
    static final ObservableCache.CacheDisposable[] EMPTY = new ObservableCache.CacheDisposable[0];
    static final ObservableCache.CacheDisposable[] TERMINATED = new ObservableCache.CacheDisposable[0];
    
    //代表上游生产者下发的元素个数
    volatile long size;
    
    //初始化值new ObservableCache.Node(capacityHint)
    final ObservableCache.Node<T> head;
    
    //初始化值new ObservableCache.Node(capacityHint)
    ObservableCache.Node<T> tail;
    
    //元素在Node存储的偏移
    int tailOffset;
    Throwable error;
    volatile boolean done;

    //初始化ObservableCache时,传入ObservableSource用于发射元素、指定Node中T[]数组容量
    public ObservableCache(Observable<T> source, int capacityHint) {
        super(source);
        this.capacityHint = capacityHint;
        this.once = new AtomicBoolean();
        ObservableCache.Node<T> n = new ObservableCache.Node(capacityHint);
        this.head = n;
        this.tail = n;
        this.observers = new AtomicReference(EMPTY);
    }

    //当订阅动作发生时,通过每次创建的Observer和一个全局的ObservableCache创建一个ObservableCache.CacheDisposable
    protected void subscribeActual(Observer<? super T> t) {
        //将产生的订阅者、ObservableCache包装成一个ObservableCache.CacheDisposable
        ObservableCache.CacheDisposable<T> consumer = new ObservableCache.CacheDisposable(t, this);
        //调ObservableCache#onSubscribe(Disposable d),啥也没做
        t.onSubscribe(consumer);
        
        //存订阅者
        this.add(consumer);
        
        //这段逻辑非常重要,首先一个订阅者之前消费过的元素,不会二次消费,cache起来的元素是给后来的订阅者准备的。这个if else 表明,对于后续的订阅者,不会再去调ObservableCreate发射元素,而是直接执行replay(consumer)下发元素并回调Observer.onNext()消费。
        if (!this.once.get() && this.once.compareAndSet(false, true)) {
            //对于第一个订阅者,它的订阅逻辑执行这里,调用ObservableCreate发射元素委托给ObservableCache#onNext()发射元素并回调Observer消费元素,于是去看onNext()方法看它如何下发并cache元素。
            this.source.subscribe(this);
        } else {
            //对于后来的订阅者,下发元素逻辑便执行的这里
            this.replay(consumer);
        }

    }

    boolean isConnected() {
        return this.once.get();
    }

    boolean hasObservers() {
        return ((ObservableCache.CacheDisposable[])this.observers.get()).length != 0;
    }

    long cachedEventCount() {
        return this.size;
    }

    //add方法中维护了一个局部变量next用来存储每次订阅动作产生的订阅者
    void add(ObservableCache.CacheDisposable<T> consumer) {
        ObservableCache.CacheDisposable[] current;
        ObservableCache.CacheDisposable[] next;
        do {
            //获取AtomicReference<ObservableCache.CacheDisposable<T>[]>引用指向的ObservableCache.CacheDisposable<T>[]
            current = (ObservableCache.CacheDisposable[])this.observers.get();
            if (current == TERMINATED) {
                return;
            }

            //新new一个ObservableCache.CacheDisposable[n+1] newer,将原ObservableCache.CacheDisposable[n] older 0-n位置元素拷贝到newer的0-n位置,并让新的订阅者comsumer放到newer n+1位置上
            int n = current.length;
            next = new ObservableCache.CacheDisposable[n + 1];
            System.arraycopy(current, 0, next, 0, n);
            next[n] = consumer;
        //通过AtomicReference<ObservableCache.CacheDisposable<T>[]>.compareAndSet(current, next),将next引用指向ObservableCache.CacheDisposable<T>[]对象替换为当前引用指向对象
        } while(!this.observers.compareAndSet(current, next));

    }

    void remove(ObservableCache.CacheDisposable<T> consumer) {
        ObservableCache.CacheDisposable[] current;
        ObservableCache.CacheDisposable[] next;
        do {
            current = (ObservableCache.CacheDisposable[])this.observers.get();
            int n = current.length;
            if (n == 0) {
                return;
            }

            int j = -1;

            for(int i = 0; i < n; ++i) {
                if (current[i] == consumer) {
                    j = i;
                    break;
                }
            }

            if (j < 0) {
                return;
            }

            if (n == 1) {
                next = EMPTY;
            } else {
                next = new ObservableCache.CacheDisposable[n - 1];
                System.arraycopy(current, 0, next, 0, j);
                System.arraycopy(current, j + 1, next, j, n - j - 1);
            }
        } while(!this.observers.compareAndSet(current, next));

    }

    //下发元素
    void replay(ObservableCache.CacheDisposable<T> consumer) {
        if (consumer.getAndIncrement() == 0) {
            int missed = 1;
            
            //
            long index = consumer.index;
            int offset = consumer.offset;
            
            //ObservableCache中维护的tail引用指向的Node
            ObservableCache.Node<T> node = consumer.node;
            
            //下游消费者
            Observer<? super T> downstream = consumer.downstream;
            int capacity = this.capacityHint;

            while(!consumer.disposed) {
                boolean sourceDone = this.done;
                
                //判断是否元素全部消费
                boolean empty = this.size == index;
                
                if (sourceDone && empty) {
                    consumer.node = null;
                    Throwable ex = this.error;
                    if (ex != null) {
                        downstream.onError(ex);
                    } else {
                        downstream.onComplete();
                    }

                    return;
                }

                if (!empty) {
                    //当前Node消费完,node偏移指向其next引用Node
                    if (offset == capacity) {
                        node = node.next;
                        offset = 0;
                    }
                    
                    //实际消费元素,node为CacheDisposable中的head引用,也就是从第一个Node开始遍历元素消费
                    downstream.onNext(node.values[offset]);
                    ++offset;
                    ++index;
                } else {
                    //下发元素全部被消费
                    consumer.index = index;
                    consumer.offset = offset;
                    consumer.node = node;
                    missed = consumer.addAndGet(-missed);
                    if (missed == 0) {
                        return;
                    }
                }
            }

            consumer.node = null;
        }
    }

    public void onSubscribe(Disposable d) {
    }

    //首先清楚一点,要cache元素应该在上游生产者处理,消费元素之前就先把元素缓存起来。
    public void onNext(T t) {
        //this.tailOffset初始值为0,当创建一个新ObservableCache.Node时并存入t时,tailOffset置为1;当直接在ObservableCache引用tail指向的ObservableCache.Node<T>节点中存入t元素于[tailOffset]索引位置时,tailOffset+1。说明tailOffset代表元素在Node节点中T[]的索引位置,值为0-initialCapacity
        int tailOffset = this.tailOffset;
        
        if (tailOffset == this.capacityHint) {
            ObservableCache.Node<T> n = new ObservableCache.Node(tailOffset);
            n.values[0] = t;
            this.tailOffset = 1;
            this.tail.next = n;
            this.tail = n;
        } else {
            this.tail.values[tailOffset] = t;
            this.tailOffset = tailOffset + 1;
        }

        //this.size代表上游生产下发存储了多少元素
        ++this.size;
        
        //获取AtomicReference<ObservableCache.CacheDisposable<T>[]>引用指向的ObservableCache.CacheDisposable<T>[],此时就拿到ObservableCache中维护的原子引用指向的消费者数组ObservableCache.CacheDisposable<T>[]
        ObservableCache.CacheDisposable[] var7 = (ObservableCache.CacheDisposable[])this.observers.get();
        int var4 = var7.length;
        
        //遍历数组,拿到每个消费者,调用replay下发元素
        for(int var5 = 0; var5 < var4; ++var5) {
            ObservableCache.CacheDisposable<T> consumer = var7[var5];
            this.replay(consumer);
        }

    }

    public void onError(Throwable t) {
        this.error = t;
        this.done = true;
        ObservableCache.CacheDisposable[] var2 = (ObservableCache.CacheDisposable[])this.observers.getAndSet(TERMINATED);
        int var3 = var2.length;

        for(int var4 = 0; var4 < var3; ++var4) {
            ObservableCache.CacheDisposable<T> consumer = var2[var4];
            this.replay(consumer);
        }

    }

    public void onComplete() {
        this.done = true;
        ObservableCache.CacheDisposable[] var1 = (ObservableCache.CacheDisposable[])this.observers.getAndSet(TERMINATED);
        int var2 = var1.length;

        for(int var3 = 0; var3 < var2; ++var3) {
            ObservableCache.CacheDisposable<T> consumer = var1[var3];
            this.replay(consumer);
        }

    }

    //Node内部维护了T[]、ObservableCache.Node<T> next
    //T[]用于存储下发元素、next指针用于构建Node链表
    static final class Node<T> {
        final T[] values;
        volatile ObservableCache.Node<T> next;

        Node(int capacityHint) {
            this.values = (Object[])(new Object[capacityHint]);
        }
    }

    //局部状态管理器,和订阅者一样,每次订阅事件产生时也会创建一个订阅者对应的CacheDisposable状态管理器。
    static final class CacheDisposable<T> extends AtomicInteger implements Disposable {
        private static final long serialVersionUID = 6770240836423125754L;
        final Observer<? super T> downstream;
        final ObservableCache<T> parent;
        ObservableCache.Node<T> node;
        
        //订阅者在Node中消费到的相对位置,使用偏移量来表示
        int offset;
        
        //全局消费到的位置
        long index;
        volatile boolean disposed;

        CacheDisposable(Observer<? super T> downstream, ObservableCache<T> parent) {
            this.downstream = downstream;
            this.parent = parent;
            
            //初始化CacheDisposable状态管理器时,node 指向第一次创建的ObservableCache.Node(capacityHint)
            this.node = parent.head;
        }

        public void dispose() {
            if (!this.disposed) {
                this.disposed = true;
                this.parent.remove(this);
            }

        }

        public boolean isDisposed() {
            return this.disposed;
        }
    }
}
//AtomicReference<ObservableCache.CacheDisposable<T>[]>
小结:Observable#cache()创建一个全局的ObservableCache<T>,其内部维护一个局部消费状态管理器CacheDisposable<T>,当下游首次产生订阅时,会创建一个ObservableCache.CacheDisposable[]并将订阅者存入同时让ObservableCache维护一个指向该ObservableCache.CacheDisposable[]的引用,同时回调ObservableCache.onNext()对下发元素存入ObservableCache内部维护的Node,Node通过维护一个Object[]和next指针用于构建存储下发元素的链表,之后回调订阅者Observer.onNext()消费元素。对于后续产生的订阅,ObservableCache每次会创建一个新的ObservableCache.CacheDisposable[],数组长度为原长度+1,并将订阅者存入,之后不会再调用ObservableCreate发射,而是直接从起始head指向的Node开始遍历元素消费,每消费完一个Node,偏移到next指向的Node继续消费数组元素。
场景:如果我们的多个订阅者,并且执行的消费逻辑比较消耗系统资源,例如数据库查询。难道每产生一个订阅都去执行数据库查询?于是可以采用cache(),首次订阅去查询数据库并将结果缓存起来,后续的订阅直接从缓存中拿到元素消费。但是cache()不同于背压设计,从源码可以看到每产生一个订阅都会new一个原订阅者数组长度+1的新数组,并且元素也会通过Node的Object[]来存储,当订阅者数量过大尤其是生产元素数量过大(比如无限流或者大数据发布流)将会导致内存溢出。-ConnectableObservable便能解决cache的缺陷,本质上去掉了存储下发元素,并在订阅时做了一个伪订阅动作用来存储消费者,在其connect()时才会真正产生订阅。

7、Observable#timer(long, java.util.concurrent.TimeUnit)

//需要传入delay、unit、Scheduler(可选,不传入时默认创建ComputationScheduler)
@CheckReturnValue
@SchedulerSupport("io.reactivex:computation")
public static Observable<Long> timer(long delay, TimeUnit unit) {
    return timer(delay, unit, Schedulers.computation());
}

@CheckReturnValue
@SchedulerSupport("custom")
public static Observable<Long> timer(long delay, TimeUnit unit, Scheduler scheduler) {
    ObjectHelper.requireNonNull(unit, "unit is null");
    ObjectHelper.requireNonNull(scheduler, "scheduler is null");
    //创建一个全局的ObservableTimer,传入一个ComputationScheduler
    return RxJavaPlugins.onAssembly(new ObservableTimer(Math.max(delay, 0L), unit, scheduler));
}

//首先需要TimerObserver处于一个Observable角色,因此它继承了Observable
public final class ObservableTimer extends Observable<Long> {
//其次需要其有调度能力,因此采用装饰者设计模式通过维护一个Scheduler增强自身,使其具有调度能力。后面消费逻辑交给调度器Scheduler去执行即可。
final Scheduler scheduler;
final long delay;
final TimeUnit unit;

public ObservableTimer(long delay, TimeUnit unit, Scheduler scheduler) {
        this.delay = delay;
        this.unit = unit;
        this.scheduler = scheduler;
    }

    public void subscribeActual(Observer<? super Long> observer) {
        ObservableTimer.TimerObserver ios = new ObservableTimer.TimerObserver(observer);
        observer.onSubscribe(ios);
        Disposable d = this.scheduler.scheduleDirect(ios, this.delay, this.unit);
        ios.setResource(d);
    }

    //调度器需要传入一个Runnable任务,因此继承Runnable
    static final class TimerObserver extends AtomicReference<Disposable> implements Disposable, Runnable {
        private static final long serialVersionUID = -2809475196591179431L;
        
        //还需要将消费者和调度器结合起来,因此维护一个Observer用来增强调度器,使调度器能改变订阅者
        final Observer<? super Long> downstream;

        TimerObserver(Observer<? super Long> downstream) {
            this.downstream = downstream;
        }

        public void dispose() {
            DisposableHelper.dispose(this);
        }

        public boolean isDisposed() {
            return this.get() == DisposableHelper.DISPOSED;
        }

        public void run() {
            if (!this.isDisposed()) {
                //消费元素
                this.downstream.onNext(0L);
                this.lazySet(EmptyDisposable.INSTANCE);
                this.downstream.onComplete();
            }

        }

        public void setResource(Disposable d) {
            DisposableHelper.trySet(this, d);
        }
    }
}

接下来看订阅核心方法:
public void subscribeActual(Observer<? super Long> observer) {
    //将订阅者包装为ObservableTimer.TimerObserver
    ObservableTimer.TimerObserver ios = new ObservableTimer.TimerObserver(observer);
    observer.onSubscribe(ios);
    
    //通过调度器Scheduler#scheduleDirect来执行TimerObserver的run()方法
    Disposable d = this.scheduler.scheduleDirect(ios, this.delay, this.unit);
    ios.setResource(d);
}

    //将消费逻辑包装为一个ScheduledDirectTask交给线程池ComputationScheduler.FixedSchedulerPool执行
    public Disposable scheduleDirect(Runnable run, long delayTime, TimeUnit unit) {
        ScheduledDirectTask task = new ScheduledDirectTask(RxJavaPlugins.onSchedule(run));

        try {
            Object f;
            if (delayTime <= 0L) {
                f = this.executor.submit(task);
            } else {
                f = this.executor.schedule(task, delayTime, unit);
            }

            task.setFuture((Future)f);
            return task;
        } catch (RejectedExecutionException var7) {
            RxJavaPlugins.onError(var7);
            return EmptyDisposable.INSTANCE;
        }
    }

    public void run() {
        if (!this.isDisposed()) {
            //TimerObserver包装了下游消费者downstream,执行消费逻辑,默认消费0
            this.downstream.onNext(0L);
            this.lazySet(EmptyDisposable.INSTANCE);
            this.downstream.onComplete();
        }
    }

8、Observable#fromCallable(Callable<? extends T> supplier)

Callable<? extends T>接口类似于Runnable(),但它是能接收到返回值的,不能计算到返回值时,会抛出异常。

@CheckReturnValue
@SchedulerSupport("none")
@NonNull
public static <T> Observable<T> fromCallable(Callable<? extends T> supplier) {
    ObjectHelper.requireNonNull(supplier, "supplier is null");
    //创建一个全局的ObservableFromCallable
    return RxJavaPlugins.onAssembly(new ObservableFromCallable(supplier));
}

//生产者角色,继承Observable<T>,另外还实现了Supplier,它具有Supplier角色
public final class ObservableFromCallable<T> extends Observable<T> implements Supplier<T> {
    final Callable<? extends T> callable;

    public ObservableFromCallable(Callable<? extends T> callable) {
        this.callable = callable;
    }

    //实际订阅
    public void subscribeActual(Observer<? super T> observer) {
        //包装订阅者
        DeferredScalarDisposable<T> d = new DeferredScalarDisposable(observer);
        observer.onSubscribe(d);
        if (!d.isDisposed()) {
            Object value;
            try {
                //调用callable.call()并拿到返回值
                value = ExceptionHelper.nullCheck(this.callable.call(), "Callable returned a null value.");
            } catch (Throwable var5) {
                Exceptions.throwIfFatal(var5);
                //响应式异常处理,捕捉到异常后判断如果订阅没撤销,下发一个error事件
                if (!d.isDisposed()) {
                    observer.onError(var5);
                } else {
                    //否则,抛出全局异常
                    RxJavaPlugins.onError(var5);
                }

                return;
            }
            
            //拿到callable结果后,调用状态管理器complete(value)
            d.complete(value);
        }
    }

    public T get() throws Throwable {
        return ExceptionHelper.nullCheck(this.callable.call(), "The Callable returned a null value.");
    }
}


    public final void complete(T value) {
        int state = this.get();
        if ((state & 54) == 0) {
            //获取状态管理器包装的下游消费者
            Observer<? super T> a = this.downstream;
            if (state == 8) {
                this.value = value;
                this.lazySet(16);
                a.onNext((Object)null);
            } else {
                this.lazySet(2);
                //消费元素
                a.onNext(value);
            }

            if (this.get() != 4) {
                a.onComplete();
            }

        }
    }

9、状态管理Disposable