Определение потоков выполнения операторов RxJava в цепочке с subscribeOn и observeOn

Эмиссия just и map будут выполняться на io; конечный subscribe — на computation. Из двух subscribeOn источник определяет ближайший к нему, а последний observeOn задаёт поток ниже себя.

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

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

Эмиссия just и map будут выполняться на io; конечный subscribe — на computation. Из двух subscribeOn источник определяет ближайший к нему, а последний observeOn задаёт поток ниже себя.

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

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

Условие

Нужно понять, в каком потоке будет происходить выполнение операторов just, map и subscribe, если запуск происходит из главного (UI) потока.

Observable.just(true, true)
.map { }
.subscribeOn(Schedulers.io())
.subscribeOn(Schedulers.computation())
.observeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.subscribe { }

Ответ

Эмиссия just и map будут выполняться на io; конечный subscribe — на computation. Из двух subscribeOn источник определяет ближайший к нему, а последний observeOn задаёт поток ниже себя.

Создание Observable.just(true, true) происходит при построении цепочки на UI, но отправка его значений откладывается до подписки. subscribeOn(computation) добавляет промежуточное планирование, не переопределяя источник на io. Затем сигналы проходят observeOn(io) и observeOn(computation). Если внутри just было бы дорогое вычисление аргумента, оно выполнилось бы сразу при создании, поэтому для отложенной работы нужен defer/fromCallable.

Источник: reactivex.io.

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

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

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

Подробнее