[RxJava] RxAndroid Scheduler

Jay·2021년 1월 27일
0

RxJava

목록 보기
4/7
post-thumbnail

Scheduler !?

RxAndroid에선 스켸줄러를 통해 어느 스레드에서 실행될 지를 정할 수 있다.
스켸줄러는 subscribeOn(), observeOn()에서 정할 수 있는데

subsribeOn()은 observable의 작업을 시작하는 스레드를 정할 수 있다.
중복해서 적을 경우, 가장 마지막에 적은 스레드에서 작업을 시작한다.

observeOn()은 이후에 오는 오퍼레이터, subscribe의 스켸줄러를 변경 할 수 있다.


공식 문서에서 제공해주는 스켸줄러 그림을 보면
중간에 subscribeOn()을 하지만 어디서에서 호출하든 상관없이 적용되는 것을 볼 수 있다.


오퍼레이터 어디서든 subscribeOn()을 사용하여 시작할 스켸줄러를 정할 수 있다.

위의 그림에서 observeOn으로 데이터를 옵저빙 할 수 있는 스레드를 정하는데 주황색의 스레드에서 데이터를 옵저빙 하다가 마지막에 observeOn()을 한번 더 하면서 분홍색 스레드에서 데이터를 옵저빙할 수 있게된다.
중복해서 적을 경우, 마지막에 적은 스레드에서 작업을 한다고 하였다.


RxJava와 RxAndroid에서의 Scheduler

  • Schedulers.computation()
    이벤트 루프에서 간단한 연산이나 콜백 처리를 위해 사용됩니다.
    RxComputationThreadPool라는 별도의 스레드 풀에서 돌아갑니다.
    최대 cpu 갯수 개의 스레드 풀이 순환하면서 실행됩니다.

  • Schedulers.immediate()
    현재 스레드에서 즉시 수행합니다.
    observeOn()이 여러번 쓰였을 경우 immediate()를 선언한 바로 윗쪽의 스레드를 따라갑니다.

  • Schedulers.from(executor)
    특정 executor를 스케쥴러로 사용합니다.

  • Schedulers.io()
    동기 I/O를 별도로 처리시켜 비동기 효율을 얻기 위한 스케줄러입니다.
    자체적인 스레드 풀 CachedThreadPool을 사용합니다.
    API 호출 등 네트워크를 사용한 호출 시 사용됩니다.

  • Schedulers.newThread()
    새로운 스레드를 만드는 스케쥴러입니다.

  • Schedulers.trampoline()
    큐에 있는 일이 끝나면 이어서 현재 스레드에서 수행하는 스케쥴러.

  • AndroidSchedulers.mainThread()
    안드로이드의 UI 스레드에서 동작합니다.
    네트워크를 통해 가져온 데이터를 구독 할 스레드를 정할 때 많이 사용해보았다.

  • HandlerScheduler.from(handler)
    특정 핸들러 handler에 의존하여 동작합니다.


Example

보통 이런식으로 remote 통신을 하여 데이터를 가져올 때 사용된다.
데이터를 가져오는 무거운 작업에 대해 main thread(UI Thread)에서의 작업을 지양하기에 비동기 효율을 높일 수 있도록 데이터를 비동기로 가져오고 메인 스레드에서 가져온 데이터를 구독한다.

 fun getCoffeeMenu() : Single<List<MenuItem>> {
        return apiService.getAllMenus()
                .subscribeOn(Schedulers.io()) //Observable이 발행되는 스레드를 지정한다. 동기 IO를 별도로 처리하여 비동기 효율을 극대화하기 위해 사용하였다.
                .observeOn(AndroidSchedulers.mainThread()) //처리된 결과를 전달하는 스레드 지정한다. = 워크 스레드에서 데이터를 가져오지만 가져온 데이터 구독은 메인 스레드에서 하겠다.                
    }
profile
developer

0개의 댓글