Given a chain of Rx operators, you can run certain parts of the chain on a different scheduler. SubscribeOn sets the initial scheduler of the chain, and when you call ObserveOn, the rest of the chain starts running on that scheduler, until you call ObserveOn again. You can call SubscribeOn at any point, and calling it multiple times makes little sense. ObserveOn applies to the rest of the chain from there on, so calling it multiple times makes a lot of sense. Nice diagram: http://reactivex.io/documentation/scheduler.html
Observable.From(...) ----------\
v |
Map |-- runs on threadpool
v |
Filter ----------------------/
v
ObserveOn(UIScheduler)