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())
}
참고 : 옥수환 지음[아키텍처를 알아야 앱 개발이 보인다]
'Android > RxJava' 카테고리의 다른 글
[차근차근 RxJava 기록 5] Observable을 생성하는 연산자 (0) | 2022.01.24 |
---|---|
[차근차근 RxJava 기록 3] 다양한 형태의 Observable (0) | 2022.01.21 |
[차근차근 RxJava 기록 2] Observable의 이벤트와 생성 (0) | 2022.01.21 |
[차근차근 RxJava 기록 1] RxJava는 무엇인가? (0) | 2022.01.19 |