본문

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(11011, 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

공유

댓글