一劳永逸,doOnSubcribe怎么了

Once and for all , whats up with doOnSubcribe

考虑以下可观察链

        Observable.just(1).
            doOnSubscribe(disposable -> Log.d("ThreadInDoSub", Thread.currentThread().getName())).
            subscribe();

日志报告线程是主线程。这没关系。现在

Observable.just(1).
            doOnSubscribe(disposable -> Log.d("ThreadInDoSub", Thread.currentThread().getName())).
            subscribeOn(SchedulerProvider.getInstance().io()).
            observeOn(SchedulerProvider.getInstance().ui()).
            subscribe();

日志报告 RxCachedThreadScheduler。现在

Observable.just(1).
        subscribeOn(SchedulerProvider.getInstance().io()).
        observeOn(SchedulerProvider.getInstance().ui()).
        doOnSubscribe(disposable -> Log.d("ThreadInDoSub", Thread.currentThread().getName())).
        subscribe();

日志报告主要。

问题 为什么 doOnSub 的位置会影响调用它的线程? .整个链条不是在点击订阅方法时执行的吗? .我很困惑。

subscribeOn 在其下游调用 onSubscribe,然后在给定调度程序上安排对其上游的订阅,因此 doOnSubscribe 在订阅 subscribeOn 的线程上被调用到。这样做是为了更急切地取消日程。