본문
RxJava Observable 생성
도입
이번 포스팅에서는 Observable(Source)를 만드는 생성 연산자에 대해 정리할 예정이다.
생성 연산자는 아래와 같은 함수들이 존재한다.
(출처 - http://reactivex.io/documentation/ko/operators.html)
그 중에 오늘은 interval, timer, range, intervalRange, repeat에 대해 정리할 예정이다.
사전 지식
소스를 확인해보면 다음과 같은 어노테이션을 확인 할 수 있다.
1 2 3 | @CheckReturnValue @SchedulerSupport(SchedulerSupport.NONE) public static Observable<Integer> range(final int start, final int count) { | cs |
해당 어노테이션의 의미는
@SchedulerSupport(SchedulerSupport.COMPUTATION) : 메인이 아닌 계산 스레드에서 실행
@SchedulerSupport.NONE : 현재 스레드에서 실행
이다.
interval 개념
@SchedulerSupport(SchedulerSupport.COMPUTATION)
interval은 일정 시간 간격으로 데이터 흐름을 생성한다.
(출처 - http://reactivex.io/documentation/operators/interval.html)
interval 실습
1 2 3 4 5 6 7 8 9 | fun intervalFunc() { val s = Observable.interval(1, TimeUnit.SECONDS) .take(5) .subscribe { result -> Log.e("heepie_test", "[interval] $result") } // 메모리 해제 확인 Thread.sleep(7000) Log.e("heepie_test", "isDisposed: ${s.isDisposed}") } | cs |
interval 스크린 샷
timer 개념
@SchedulerSupport(SchedulerSupport.COMPUTATION)
일정 시간이 지난 후 한 개의 데이터를 발행하고 onComplete() 실행한다.
(출처 - http://reactivex.io/documentation/operators/timer.html)
timer 실습
1 2 3 4 5 6 7 8 9 | fun timerFunc() { val s = Observable.timer(1, TimeUnit.SECONDS) .map { Unit -> "timer result"} .subscribe { result -> Log.e("heepie_test", "[timer] $result") } // 메모리 해제 확인 Thread.sleep(7000) Log.e("heepie_test", "${s.isDisposed}") } | cs |
timer 스크린샷
range 개념
@SchedulerSupport.NONE
파라미터 n부터 m개의 값을 Int 객체로 발행한다. 모든 반복문을 대체 가능하다.
(출처 - http://reactivex.io/documentation/operators/range.html)
range 실습
1 2 3 4 5 6 7 8 | fun rangeFunc() { val s = Observable.range(5,10) .subscribe { result -> Log.e("heepie_test", "[range] $result") } // 메모리 해제 확인 Thread.sleep(7000) Log.e("heepie_test", "${s.isDisposed}") } | cs |
range 스크린샷
intervalRange 개념
interval + range 이다.
일정 시간 간격으로 n부터 m개를 Int 객체로 발행한다.
(출처 - http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html)
intervalRange 실습
1 2 3 4 5 6 7 8 | fun intervalRangeFunc() { val s = Observable.intervalRange(1, 10, 1, 1, TimeUnit.SECONDS) .subscribe { result -> Log.e("heepie_test", "[intervalRange] $result") } // 메모리 해제 확인 Thread.sleep(12000) Log.e("heepie_test", "${s.isDisposed}") } | cs |
intervalRange 스크린샷
customIntervalRange = interval + range
앞서 말한 것처럼 customIntervalRange는 interval와 range 함수를 합친 것이다.
그렇기 때문에 intervalRange를 사용하지 않고 interval과 range를 결합해 만드는 것이 가능하다.
customIntervalRange 실습
1 2 3 4 5 6 7 8 9 10 | fun customInterRangeFunc() { val s = Observable.timer(1, TimeUnit.SECONDS) .flatMap { ob -> Observable.interval(1, TimeUnit.SECONDS).take(10) } .map { i -> i + 1 } .subscribe { result -> Log.e("heepie_test", "[customIntervalRange] $result") } // 메모리 해제 확인 Thread.sleep(12000) Log.e("heepie_test", "${s.isDisposed}") } | cs |
customIntervalRange 스크린 샷
스크린 샷을 확인하면 intervalRange와 결과가 동일하다는 것을 알 수 있다.
repeat 개념
이름처럼 단순히 반복을 실행하는 함수이다.
인자를 입력하지 않으면 영원히 반복, repeat(N) N번 만큼 반복한다.
(출처 - http://reactivex.io/RxJava/javadoc/io/reactivex/Observable.html)
repeat 실습
1 2 3 4 5 6 7 8 9 | fun repeatFunc() { val s = Observable.just("1", "2", "3") .repeat(4) .subscribe { result -> Log.e("heepie_test", "[repeat] $result") } // 메모리 해제 확인 Thread.sleep(1000) Log.e("heepie_test", "${s.isDisposed}") } | cs |
repeat 스크린 샷
#rxjava #Observable 생성자 #interval #timer #range #intervalRange #repeat
'컴퓨터 > 이론: 개발' 카테고리의 다른 글
[2018.05.02] 02. Dagger2 error - Activity Injection (0) | 2018.05.02 |
---|---|
[2018.05.02] 01. Dagger2 error - AndroidSupportInjectionModule (0) | 2018.05.02 |
[2018.03.25] 28. Git 협업하기 (0) | 2018.03.25 |
코틀린(Kotlin) 기본 문법 - 5 (0) | 2018.03.23 |
[2018.03.17] 37. RxJava Subject 개념과 종류 (0) | 2018.03.17 |
댓글