Where you call subscribeOn()
in a chain doesn’t really matter. Where you call observeOn()
does matter.
subscribeOn() tells the whole chain which thread to start processing on. You should only call it once per chain. If you call it again lower down the stream it will have no effect.
observeOn() causes all operations which happen below it to be executed on the specified scheduler. You can call it multiple times per stream to move between different threads.
Take the following example:
doSomethingRx()
.subscribeOn(BackgroundScheduler)
.doAnotherThing()
.observeOn(ComputationScheduler)
.doSomethingElse()
.observeOn(MainScheduler)
.subscribe(//...)
- The
subscribeOn
causesdoSomethingRx
to be called on the BackgroundScheduler. doAnotherThing
will continue on BackgroundScheduler- then
observeOn
switches the stream to the ComputationScheduler doSomethingElse
will happen on the ComputationScheduler- another
observeOn
switches the stream to the MainScheduler - subscribe happens on the MainScheduler