Rxjava中subscribeOn(Schedulers.io())->源码分析

 

// TODO hook 给 IO 初始化

RxJavaPlugins.setInitIoSchedulerHandler(new Function<Callable<Scheduler>, Scheduler>() {
    @Override
    public Scheduler apply(Callable<Scheduler> schedulerCallable) throws Exception {
        Log.d(L.TAG, "apply: 全局 监听 init scheduler:" +schedulerCallable.call());
        return schedulerCallable.call();
    }
});
Observable.create(
        // 自定义source
        new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("xxxxx");
                Log.d(L.TAG, "自定义source: " + Thread.currentThread().getName());
            }
})
// ObservbaleCreate.subscribeOn
// TODO 第二步     new IOScheduler ---> 线程池 传递进去
.subscribeOn(
        // TODO 第一步  到底干了什么 ( new IOScheduler ---> 线程池)
        Schedulers.io() // 耗时读取的异步
        // Schedulers.newThread() // 开启新线程
)
 // A线程. subscribe
 //  ObservableSubscribeOn.subscribe
.subscribe(

        // 终点
        new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

                Disposable disposable = d;
                Log.d(L.TAG, "onSubscribe: " +  Thread.currentThread().getName());
            }

            @Override
            public void onNext(String s) {
                Log.d(L.TAG, "onNext: " + Thread.currentThread().getName());
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
});

当我们点击subscribeOn(Scheduler.io),此时处于异步线程中

此时我们看到源码 

RxJavaPlugins.onAssembly(new ObservableSubscribeOn<T>(this, scheduler));这个当中的

ObservableSubscribeOn的源码如下

public final class ObservableSubscribeOn<T> extends AbstractObservableWithUpstream<T,T> {
    final Scheduler scheduler;
    public ObservableSubscribeOn(ObservableSource<T> source, Scheduler scheduler) {
        super(source);
        this.scheduler = scheduler;
    }
    @Override
    public void subscribeActual(final Observer<? super T> s) {
        final SubscribeOnObserver<T> parent = new SubscribeOnObserver<T>(s);
        s.onSubscribe(parent);
        parent.setDisposable(scheduler.scheduleDirect(new SubscribeTask(parent)));
    }

  在ObservableSubscribeOn中subscribeActual方法中,创建了SubscribeOnObserver关联操作        Observer对象类,s.onSubscribe()当前线程中调用Observer,其中构建的SubscribeOnObserver引用类parent,调用了scheduler.scheduleDirect(new SubcribeTask),scheduler等价于刚开始Schedulers.io()

我们在看scheduler.scheduleDirect方法

*/
@NonNull
public Disposable scheduleDirect(@NonNull Runnable run) {
    return scheduleDirect(run, 0L, TimeUnit.NANOSECONDS);
}

 

ScheduleDirect的源码

 * This method is safe to be called from multiple threads but there are no
 * ordering guarantees between tasks.
 *
 * @param run the task to schedule
 * @param delay the delay amount, non-positive values indicate non-delayed scheduling
 * @param unit the unit of measure of the delay amount
 * @return the Disposable that let's one cancel this particular delayed task.
 * @since 2.0
 */
@NonNull
public Disposable scheduleDirect(@NonNull Runnable run, long delay, @NonNull TimeUnit unit) {
    final Worker w = createWorker();

    final Runnable decoratedRun = RxJavaPlugins.onSchedule(run);

    DisposeTask task = new DisposeTask(decoratedRun, w);

    w.schedule(task, delay, unit);

    return task;
}

此方法 在scheduleDirect中   createWorker()创建一个worker

此时我们看

static final class IoHolder {
    static final Scheduler DEFAULT = new IoScheduler();
}

这是Sschedule.io()的流程图

 

这其中Schedule的其他类分析

Schedulers.computation()

计算工作默认的调度器,这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。

Schedulers.immediate()

这个调度器允许你立即在当前线程执行你指定的工作。这是默认的Scheduler

Schedulers.newThread()

这个调度器正如它所看起来的那样:它为指定任务启动一个新的线程。

Schedulers.trampoline()

当我们想在当前线程执行一个任务时,并不是立即,我们可以用trampoline() 将它入队。这个调度器将会处理它的队列并且按序运行队列中每一个任务。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值