showProgress в doOnSubscribe выполнится на Schedulers.io(). Нижний subscribeOn(io) планирует подписку на участок цепочки, в котором расположен этот callback.
Разбор поведения doOnSubscribe в RxJava‑цепочке
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.