계발자 블로그

[RxJava] Scheduler 본문

Java/RxJava

[RxJava] Scheduler

더구더구 2021. 11. 29. 20:36

Scheduler란?

RxJava에서는 스케줄러(Scheduler)라는 도구를 사용하여 멀테 스레드와 같은 비동기 작업을 도와줍니다

 

스케줄러의 종류

IO 스케줄러

IO스케줄러는 네트워크 요청, 데이터베이스 쿼리 작업을 하거나 파일 시스템 환경 등의 작업에서 비동기 처리를 위한

스케줄러 입니다

newThread 스케줄러

매번 새로운 스케줄러(스레드)를 생성합니다.

 

computation 스케줄러

단순 반복적인 작업, 콜백 처리 그리고 다른 계산적인 작업에 사용됩니다.

 

Trampoline 스케줄러

새로운 스레들르 생성하지 않고 현재 스레드에 무한한 크기의 큐를 생성하는 스케줄러입니다

모든 작업을 순차적으로 실행하는 것을 보장합니다. (FIFO)

 

mainThread 스케줄러

RxAndroid에서는 안드로이드 메인 스레드에서 작동하는 스케줄러를 제공합니다.

 

 

subscirbeOn과 observeOn 연산자

RxJava에서는 스케줄러를 이용하는 방법으로 subscribeOn과 observeOn 연산자를 제공합니다.

이 연산자들을 이용하여 간단히 멀티 스레딩을 구현할 수 있습니다.

 

subscribeOn을 사용하여 스레드를 지정해본 코드입니다.

 

subscribeOn 연산자는 Observable 소스에 어떤 스케줄러를 사용하여 아이템을 발행할지 알려줍니다.

만약 Obsevable 체인에 subscribe 연산자만 있고 observaOn이 없다면 해당 스케줄러는 아이템 발행 및 구독까지

Observable 체인 전체에 작용합니다. 발행과 구독 모든 부분에서 스케줄러의 스레드를 사용하는 겁니다.

 

이번에는 observeOn 연산자를 사용했을 때 코드 입니다.

observOn 연산자를 사용하여 스케줄러를 지정하면 Observable에서 발행된 아이템을 가로채어

해당 스케줄러로 아이템을 구독합니다.

코드를 보면 아이템 발행 시와 구독 시에 스레드 이름이 다른 것을 확인할 수 있습니다!

 

 

안드로이드 앱 개발을 하다보면 서버 통신에 의한 네트워크 프로그래밍을 할 때가 많습니다.

이런 경우 서버 통신에 성공 했을 때, 실패 했을 떄 와 같이 콜백 함수를 계속 작성해 줘야 하는데

IO 스케줄러를 이용해 네트워킹을 구현 한다면 콜백 지옥에서 벗어날 수 있습니다.

 

Observable<String> source = Observable.just("https://~~~")
    .subscribeOn(Schedulers.io())
    .map(OkHttpHelper::get)
    .concatWith(Observable.just("https://~~두번째URL")
        .map(OkHttpHelper::get));
source.subscribe();

 

IO 스케줄러를 이용해 네크워크 처리를 할 것이라는 것을 subscribeOn() 연산자를 통해 명시하였고,

concatWith() 함수를 통해 현재의 Observable에 새로운 Observable을 결합하여 해결하였습니다.

위 코드는 OkHttpHelper클래스의 get() 함수에는 서버 통신에 필요한 enqueue() 메소드가 정의되어 있다고

가정한 코드입니다.

 

이처럼 Rx 스케줄러로 네트워크 통신을 처리하면 비즈니스 로직과 비동기 프로그래밍을 분리할 수 있어

프로그램의 효율을 향상시킬 수 있습니다.

 

 

 

 

'아키텍처를 알아야 앱 개발이 보인다' 책과 블로그

https://choheeis.github.io/newblog//articles/2020-04/RxScheduler

참고했습니다

'Java > RxJava' 카테고리의 다른 글

[RxJava] Subject  (0) 2021.11.29
[RxJava] 다양한 연산자들  (0) 2021.11.26
[RxJava] Observable  (0) 2021.11.26
[RxJava] RxJava란?  (0) 2021.11.26