Раз и навсегда, что случилось с doOnSubcribe - PullRequest
0 голосов
/ 04 июня 2018

Рассмотрим следующую наблюдаемую цепочку

        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();

Журнал отчетов main.

Вопрос Почему расположение doOnSub влияет на поток, в котором он вызывается?,Разве вся цепочка не выполняется после нажатия метода подписки?,Я в замешательстве.

1 Ответ

0 голосов
/ 04 июня 2018

subscribeOn вызывает onSubscribe на своем нисходящем канале перед планированием подписки на свой нисходящий канал на заданном планировщике, таким образом, doOnSubscribe вызывается в потоке, на который подписывается subscribeOn.Это сделано для того, чтобы расписание могло быть отменено более охотно.

...