Android/RxJava

[차근차근 RxJava 기록 5] Observable을 생성하는 연산자

c0de_h0ng 2022. 1. 24. 21:22
728x90

Observable으ㄹ 생성하는 연산자로는 defer, empty, never, interval, range, timer 연산자가 있다.

defer 연산자

defer 연산자는 옵서버가 구독할 때까지 Observable의 생성을 지연시킨다. subscrbie() 메소드를 호출할 때 Observable 아이템을 생성한다.

empty, never 연산자

아이템을 발행하지 않는 공통점이 있지만 never 연산자는 onComplete() 호출을 해야 종료가 된다는 차이점이 있다.

Observable.empty<String>()
.doOnTerminate {
    Log.d(TAG, "empty 종료")
}
.subscribe()
Observable.never<String>()
.doOnTerminate {
    Log.d(TAG, "never 종료")
}
.subscribe()

// D/RxJava: empty 종료

결과를 보면 Never에 onComplete()가 호출되지 않아 콜백을 받지 못하였다.

interval 연산자

설정한 시간 간격으로 순서대로 정수를 발행하는 Observable을 생성한다. 무한히 배출이 되므로 구독 중지 시에는 dispose()을 호출하여 폐기를 해야한다.

val d: Disposable = Observable.interval(1L, TimeUnit.SECONDS)
    .subscribe(System.out::println)
Thread.sleep(5000L)
d.dispose()

// 0
// 1
// 2
// 3
// 4

range 연산자

특정 범위의 정수를 순서대로 발행하는 Observable를 생성할 수 있다.

Observable.range(1, 3)
        .subscribe(System.out::println)

// 1
// 2
// 3

timer 연산자

설정한 시간동안 발행을 지연시키고 종료 시키는 Observable을 생성한다.

val src = Observable.timer(1, TimeUnit.SECONDS)
System.out.println("구독!!")
src.subscribe { event ->
    System.out.println("실행!!")
}
Thread.sleep(1001L)

코드에서는 구독 후 1초 뒤에 아이템이 발행된다.

 

참고 : 옥수환 지음[아키텍처를 알아야 앱 개발이 보인다]