Android/RxJava

[차근차근 RxJava 기록 4] Cold Observable과 Hot Observable

c0de_h0ng 2022. 1. 24. 00:51
728x90

Cold Observable

Observable에 구독을 요청하면 아이템을 발행하기 시작한다. 해당 아이템은 임의의 종료시키지 않는 이상 여러 번 요청하여도 처음부터 끝까지 발행하는 것을 보장한다.

val src = Observable.interval(1, TimeUnit.SECONDS)
src.subscribe { value -> System.out.println("#1: " + value) }
Thread.sleep(3000)
src.subscribe { value -> System.out.println("#2: " + value) }
Thread.sleep(3000)

// #1: 0
// #1: 1
// #1: 2
// #1: 3
// #2: 0
// #1: 4
// #2: 1
// #1: 5
// #2: 2

Hot Observable

아이템 발행이 시작된 이후로 모든 구독자에게 동시에 같은 아이템을 발행한다. 예를 들어 A구독자가 observable을 구독한 후 몇 초뒤 B구독자가 observable을 구독하게 된 경우에 B구독자는 몇 초동안 발행된 아이템을 놓치게 된다.

publish 연산자,  connect 연산자

Hot Observable을 구현할 수 있도록 도와주는 타입인 ConnectableObservable은 publish 연산자를 사용하여 Observable으로 반환할 수 있다. ConnectableObservable은 구독을 요청하여도 Observable은 데이터를 발행하지 않는다. connect 연산자를 호출해야만 아이템을 발행하기 시작한다.

val src = Observable.interval(1, TimeUnit.SECONDS)
    .publish()
src.connect() //발행시작
src.subscribe { value ->
    System.out.println("#1: " + value)
}
Thread.sleep(3000)
src.subscribe { value ->
    System.out.println("#2: " + value)
}
Thread.sleep(3000)

// #1: 0
// #1: 1
// #1: 2
// #1: 3
// #2: 3
// #1: 4
// #2: 4

빌드 결과를 보시다시피 Hot Observable로 아이템을 발행을 하면 #2은 0, 1, 2를 받지 못한다.

autoConnect 연산자

autoConnect 연산자는 connect연산자를 호출하지 않아도 되며 구독 시 즉시 아이템을 발행한다. autoConnect(Int)은 인자로 아이템을 발행하는 구독자 수를 설정할 수 있다. 만약 구독자가 2개 이상인 경우에는 autoConnect(2)으로 선언하면 된다. 그리고 구독자가 2개 이상 붙어야 아이템을 발행하기 시작한다. 기본 값으로는 1이며 이는 구독하자마자 발행을 시작하며 0 이하이면 구독자 수와 상관없이 바로 발행을 시작한다.

val src = Observable.interval(1, TimeUnit.SECONDS)
    .publish()
    .autoConnect(2)
src.subscribe { i ->
    Log.d("A:", i.toString())
}
src.subscribe { i ->
    Log.d("B:", i.toString())
}

 

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