컴퓨터공부/RxJava

observeOn vs subscribeOn

achivenKakao 2021. 8. 30. 18:43

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 스레드에서 돌아간다.

 

출처 : https://stackoverflow.com/questions/44984730/rxandroid-whats-the-difference-between-subscribeon-and-observeon