Разбор поведения doOnSubscribe в RxJava‑цепочке

showProgress в doOnSubscribe выполнится на Schedulers.io(). Нижний subscribeOn(io) планирует подписку на участок цепочки, в котором расположен этот callback.

Короткий ответ

Что ответить на собеседовании

showProgress в doOnSubscribe выполнится на Schedulers.io(). Нижний subscribeOn(io) планирует подписку на участок цепочки, в котором расположен этот callback.

Подробный разбор

Ответ с пояснениями

Условие

В методе updateRegions вызывается getRegions, который возвращает Single со списком регионов, при этом внутри цепочки поток не переключается. Необходимо объяснить, на каком Scheduler‑е будет выполнен код, переданный в doOnSubscribe.

fun updateRegions() {
    getRegions()
        .subscribeOn(Schedulers.single())
        .observeOn(Schedulers.computation())
        .doOnSubscribe {
            showProgress()
        }
        .subscribeOn(Schedulers.io())
        .subscribe(
            { regions ->
                showRegions(regions)
            }
        )
}

Опишите, какой поток будет использоваться для вызова showProgress() и почему.

Ответ

showProgress в doOnSubscribe выполнится на Schedulers.io(). Нижний subscribeOn(io) планирует подписку на участок цепочки, в котором расположен этот callback.

observeOn(computation) переключает уведомления результата, а не onSubscribe. Верхний subscribeOn(single) отдельно планирует подписку на сам getRegions, но сначала синхронно сообщает downstream о подписке. Именно это сообщение доходит до doOnSubscribe на io. Если showProgress меняет View, его нужно выполнить на Main; одного observeOn перед ним для этого недостаточно.

Источник: github.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее