Лямбда flatMap, вызывающая getCity(), выполнится на Schedulers.computation(): непосредственно перед ней стоит observeOn(computation). Последующий subscribeOn(io) это не переопределяет.
Разбор поведения flatMap в цепочке RxJava
Лямбда flatMap, вызывающая getCity(), выполнится на Schedulers.computation(): непосредственно перед ней стоит observeOn(computation). Последующий subscribeOn(io) это не переопределяет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В методе updateRegions возвращается Single со списком регионов, при этом поток выполнения внутри него не меняется. Нужно объяснить, на каком Scheduler‑е будет исполняться код внутри flatMap(getCity()).
fun updateRegions() {
getRegions()
.subscribeOn(Schedulers.single())
.observeOn(Schedulers.computation())
.flatMap {
getCity()
}
.subscribeOn(Schedulers.io())
.subscribe(
{ regions ->
showRegions(regions)
}
)
}
Опишите, как взаимодействуют subscribeOn и observeOn в этой цепочке и какой поток будет использован для вызова getCity() внутри flatMap.
Ответ
Лямбда flatMap, вызывающая getCity(), выполнится на Schedulers.computation(): непосредственно перед ней стоит observeOn(computation). Последующий subscribeOn(io) это не переопределяет.
Источник getRegions подписывается через ближайший к нему subscribeOn(single). Вызов getCity происходит ниже observeOn, поэтому начинается на computation. Дальнейшие сигналы зависят от внутренних операторов источника getCity; отдельный observeOn может сменить поток ещё раз. UI нельзя безопасно обновлять из computation без переключения на Android main thread.
Источник: reactivex.io.