subscribeOn
: 현재 Observable가 시작하는 스레드를 지정한다.(지정하지 않을 경우 현재 Observable을 호출하는 스레드를 따라간다.)
: 여러번 호출 할 경우 첫번째 것만 사용된다.
observeOn
: 'observeOn() 구문' 아래에 나올 구문들의 스레드를 지정한다.
: .observeOn() 안의 스레드는 ui 스레드나, background 스레드 모두 지정할 수 있다.
일반적인 사용
: subscribeOn()에서 background 스레드(Schedulers.computation(), Schedulers.io()) 를 지정하여 데이터를 모으고,
데이터를 UI에 보여줄 때 observeOn() 을 이용해서 ui 스레드로 변경해서 보여준다.
예시 )
Observable.just("Some string") // 2 (io)
.doOnSubscribe(~background work~) // 2-1 (io)
.map(str -> str.length()) // 3 (io)
.observeOn(Schedulers.computation()) // 4 (changing computation thread)
.map(length -> 2 * length) // 5 (computation)
.observeOn(AndroidSchedulers.mainThread()) // 6 (changing ui thread)
.subscribeOn(Schedulers.io()) // 1 (changing io thread)
.subscribe(~UI work~) // 7 (ui thread)
코드 해석
- 1번에서 io를 스레드로 지정했기 때문에 2, 2-1, 3 번이 모두 io 스레드에서 돌아간다.
- 4번에서 computation 스레드로 변경을 한다. 그래서 5번도 computation 스레드에서 돌아간다.
- 6번에서 ui 스레드로 변경을 한다. 이게 없을 경우 computation 스레드를 계속 이용했을 것이다.
- 7번은 ui 스레드에서 돌아간다.