subscribeOn() задает поток, на котором происходит подписка, и имеет эффект от создания Observable и вниз по цепочке вызовов RxJava до первого observeOn().Это поведение обусловлено реализацией оператора
subscribeOn():1. При вызове
Observable.subscribeOn() создается объект класса ObservableSubscribeOn, который является наследником Observable и выступает в качестве враппера для оригинального observable.2. Когда на observable вызывается метод
subscribe(), вызов делегируется в абстрактный метод subscribeActual() класса Observable, который реализован в ObservableSubscribeOn.3. В методе
subscribeActual() вызывается scheduleDirect() на объекте типа Scheduler, который был передан аргументом в оператор subscribeOn().Параметром метода
scheduleDirect() передается Runnable, в котором вызывается source.subscribe(), где source – это оригинальный Observable.Из такой реализации следует, что все что делает
subscribeOn() – это создание класса-враппера, который делегирует вызов subscribe() на оригинальный Observable, со сменой треда на переданный шедулер.