RxAndroid에선 스켸줄러를 통해 어느 스레드에서 실행될 지를 정할 수 있다.
스켸줄러는 subscribeOn(), observeOn()에서 정할 수 있는데
subsribeOn()
은 observable의 작업을 시작하는 스레드를 정할 수 있다.
중복해서 적을 경우, 가장 마지막에 적은 스레드에서 작업을 시작한다.
observeOn()
은 이후에 오는 오퍼레이터, subscribe의 스켸줄러를 변경 할 수 있다.
공식 문서에서 제공해주는 스켸줄러 그림을 보면
중간에 subscribeOn()을 하지만 어디서에서 호출하든 상관없이 적용되는 것을 볼 수 있다.
오퍼레이터 어디서든 subscribeOn()을 사용하여 시작할 스켸줄러를 정할 수 있다.
위의 그림에서 observeOn으로 데이터를 옵저빙 할 수 있는 스레드를 정하는데 주황색의 스레드에서 데이터를 옵저빙 하다가 마지막에 observeOn()을 한번 더 하면서 분홍색 스레드에서 데이터를 옵저빙할 수 있게된다.
중복해서 적을 경우, 마지막에 적은 스레드에서 작업을 한다고 하였다.
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에 의존하여 동작합니다.
보통 이런식으로 remote 통신을 하여 데이터를 가져올 때 사용된다.
데이터를 가져오는 무거운 작업에 대해 main thread(UI Thread)에서의 작업을 지양하기에 비동기 효율을 높일 수 있도록 데이터를 비동기로 가져오고 메인 스레드에서 가져온 데이터를 구독한다.
fun getCoffeeMenu() : Single<List<MenuItem>> {
return apiService.getAllMenus()
.subscribeOn(Schedulers.io()) //Observable이 발행되는 스레드를 지정한다. 동기 IO를 별도로 처리하여 비동기 효율을 극대화하기 위해 사용하였다.
.observeOn(AndroidSchedulers.mainThread()) //처리된 결과를 전달하는 스레드 지정한다. = 워크 스레드에서 데이터를 가져오지만 가져온 데이터 구독은 메인 스레드에서 하겠다.
}