본 내용은 필자가 학습한 내용을 정리하는 내용입니다. 대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다! RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에 저자님의 블로그 https://brunch.co.kr/@yudong#info |
RxJava의 버전별 스케줄러 종류
스케줄러 | RxJava 2.x | RxJava 1.x |
뉴 스레드 스케줄러 | newThread() | newThread() |
싱글 스레드 스케줄러 | single() | 지원 안 함 |
계산 스케줄러 | computation() | computation() |
IO 스케줄러 | io() | io() |
트램펄린 스케줄러 | trampoline() | trampoline() |
메인 스레드 스케줄러 | 지원 안 함 | im |
테스트 스케줄러 | 지원 안 함 | test() |
스케줄러 동작 방법
1. 스케줄러는 RxJava 코드를 어느 스레드에서 실행할지 지정할 수 있다.
2. subscribeOn() 함수와 observeOn() 함수를 모두 지정하면 Observable에서 데이터 흐름이
발생하는 스레드와 처리된 결과를 구독자에게 발행하는 스레드를 분리할 수 있다.
3. subscribeOn() 함수만 호출하면 Observable의 모든 흐름이 동일한 스레드에서 실행된다.
4. 스케줄러를 별도로 지정하지 않으면 현재(main)스레드에서 동작을 실행한다
계산스케줄러
RxJava에서 추천하는 스케줄러는 크게 3가지 입니다 .
첫 번쨰는 계산(Computation) 스케줄러
두 번째는 IO 스케줄러
세 번째는 트램펄린 스케줄러 입니다.
앞서배웠던 뉴스레드 스케줄러나 다른 스케줄러는 특수한 상황에서 적용하길 권장합니다.
사실 계산 스케줄러는 수차례 예제에 등장했습니다
interval()함수의 원형을 보면
public static Observable<Long> interval(long period, TimeUnit unit)
interval() 함수는 기본적으로 계산 스케줄러에서 동작합니다. 물론 내가 원하는 스케줄러에서 동작하도록 변경할 수도 있습니다.
스케줄러를 지정할 수 있는 interval() 함수의 원형은 다음과 같습니다.
long period, TimeUnit unit, Scheduler scheduler)
데이터 흐름은 '1','3','5'로 동일합니다. 앞서 zipWith()함수로 데이터와 시간을 합성할 수 있다고 했었습니다. 여기서도 배열에 들어있는 데이터와 interval() 함수를 합성하여 시간간격으로 데이터를 발행했습니다. zipWith() 함수는 쓰임이 많으므로 잘 익혀두면 좋습니다.
람다 표현식으로 표현한 (a,b) -> a 는 시간은 그대로 두고 데이터만 취했습니다.
동시 실행을 위해서 첫 번재 구독과 두 번째 구독 사이에 sleep()을 주지않았고,
subscribeOn()을 호출하여 Schedulers.computation()으로 계산스케줄러로 설정했습니다.
사실 interval() 함수는 기본적으로 계산스케줄러를 사용하기 때문에 .subscribeOn()부분을 삭제
하여도 똑같이 동작합니다.
실행결과
RxComputationThreadPool-3 | value = <<5>>
첫번째 구독과 두번째 구독이 거의 동시에 이루어지기 때문에 RxJava 내부에서 동일한 스레드에 작업을 할당했기 때문입니다. 반면에 뉴스레드 스케줄러로 한다면 매번 새로운 스레드가 할당될것입니다.
'Rx' 카테고리의 다른 글
스케줄러 -4( 트램펄린 스케줄러 ) (0) | 2018.12.27 |
---|---|
스케줄러 -3( IO스케줄러 ) (0) | 2018.12.27 |
스케줄러 -1 (스케줄러의종류,뉴스레드스케줄러) (0) | 2018.12.27 |
스케줄러란? (0) | 2018.12.27 |
리액티브연산자[수학 및 기타연산자]- 19(수학, delay, timeInterval 함수) (0) | 2018.12.27 |
댓글