ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxJava - observeOn, subscribeOn
    개발/안드로이드 2020. 6. 28. 18:00

     

    RxJava의 observeOn, subscribeOn 함수를 이용하면 실행할 코드의 쓰레드 종류를 설정해줄 수 있다. 안드로이드의 경우 로컬 데이터 DB에 접근할 때는 IO 쓰레드를 사용해야하고 화면을 업데이트 할 때는 UI 쓰레드를 사용해야하며 이를 어기면 파란색 에러를 내뿜으면서 작업을 실행하지 않는데 RxJava의 observeOn, subscribeOn 함수를 사용하면 여기서 발생하는 오류들을 쉽게 해결할 수 있다.

     

    일반적으로 subscribeOn 함수는 호출 시점 상위에 해당하는 부분의 쓰레드를, observeOn은 호출시점 하위 스트림의 쓰레드를 설정한다. 아래 코드 Single.fromCallable과 map 함수가 IO thread에서 실행되게 되고 하위 doOnSuccess와 doOnError는 mainThread를 따르게 된다. UI와 무관한 데이터 전처리 작업은 IO thread에서 실행하도록 설정하고 그 이후 화면을 업데이트할 때 사용하는 코드는 mainThread에 둔다면 동작이 스무스한 애플리케이션을 만들 수 있다.

     

    private fun getLong(): Single<Long> = Single.fromCallable {
        1L // IO thread
    }
        .map { it + 10 } // IO thread
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSuccess {  } // main thread
        .doOnError {  } // main thread

     

    subscribeOn은 상위 스트림 쓰레드를 결정하지 못하는 경우가 있다. 스택오버플로우에서는 이런 경우가 언제 발생하는지 그리고 어떻게 변경할 수 있는지 질의응답이 있는데 나는 개인적으로 일반적인 경우에서 벗어난 일이 발생한다면 나는 스트림을 잘못 구현한 것이라고 본다. 이럴 때는 너무 긴 스트림을 잘게 쪼개서 일반적인 경우를 따르도록 만드는게 좋다고 생각한다.

     

    '개발 > 안드로이드' 카테고리의 다른 글

    Hilt - Dagger를 이을 의존성 주입 라이브러리(1)  (2) 2020.07.08
    RxJava - debounce  (0) 2020.07.04
    RxJava - combineLatest  (0) 2020.06.28
    status bar 영역 덮는 view 만들기  (0) 2020.06.24
    Lottie 라이브러리  (0) 2020.06.24

    댓글

Designed by Tistory.