Ответ
subscribeOn определяет поток, на котором будет выполняться сама подписка и обработка данных в цепочке операторов. Если указать subscribeOn несколько раз, будет использован первый вызов.
observeOn устанавливает поток, на котором будут обрабатываться последующие операторы после него. Можно вызывать несколько раз для разных участков цепочки.
Observable.just(1, 2, 3)
.subscribeOn(Schedulers.io()) // Источник и первые операторы на IO
.map { it * 2 } // Выполняется на IO
.observeOn(AndroidSchedulers.mainThread()) // Далее на UI
.subscribe { result ->
// Обработка на главном потоке
}
Ключевое отличие: subscribeOn влияет на источник и вышестоящие операторы, observeOn — на нижестоящие.