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

Лямбда flatMap, вызывающая getCity(), выполнится на Schedulers.computation(): непосредственно перед ней стоит observeOn(computation). Последующий subscribeOn(io) это не переопределяет.

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

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

Лямбда 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.

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

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

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

Подробнее