.observeOn() works a bit differently than .subscribeOn(). Whenever .observeOn() is called, it changes the thread of downstream where the code is getting executed.
Consider that we have a flow that looks like this:
Observable.just("One", "Two", "Three") .doOnNext(i -> log("doOnNext", i)) .observeOn(Schedulers.newThread()) .doOnNext(i -> log("doOnNext", i)) .subscribe(i -> log("subscribe", i));
Its structure can be represented in the following figure:
The output of such a call will be as follows: