본문 바로가기

안드로이드

안드로이드 RxJava #3 Cold Observable, Hot Observable

 

안녕하세요

이번 시간에는 Cold Observable과 Hot Observable에 대해 알아보겠습니다.

 

Observable을 구현하는 방식에는 2가지가 있습니다.

미묘한 차이지만 전혀 다른 결과를 보여줍니다.

Cold Observable과 Hot Observable가 있습니다.

 

Cold Observable는 처음부터 발행된 아이템을 구독한다.

Hot Observable는 아이템이 발행된 이후 모든 구독자에게 동시에 같은 아이템을 발행한다.

 

예를 들어 설명하면

Cold Observable 는 유튜브 동영상을 재생하는 것처럼, 구독을 요청하면 아이템을 발행한다.

Hot Observable 는 유튜브 라이브 방송을 시청하는 것처럼, 아이템 발행이 시작된 이후 모든 구독자에게 동시에 같은 아이템을 발행한다.

라고 생각 하시면 편할 거 같습니다.

 

 

Cold Observable

	Observable src = Observable.interval(1, TimeUnit.SECONDS);
        src.subscribe(value -> Log.e("첫 번째 구독",value.toString()));
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        src.subscribe(value -> Log.e("두 번째 구독",value.toString()));

코드를 설명하자면 interval은 타이머라고 생각하면 편할 겁니다.

1초마다 아이템을 발행하는 Observable을 만들었습니다.

첫 번째 구독을 하고 3초 동안 프로그램을 잠시 멈추었습니다.

이후 두 번째 구독을 했습니다.

 

2022-11-02 18:04:43.225 24934-24972/com.psw.rxtest2 E/첫 번째: 0
2022-11-02 18:04:44.225 24934-24972/com.psw.rxtest2 E/첫 번째: 1
2022-11-02 18:04:45.224 24934-24972/com.psw.rxtest2 E/첫 번째: 2
2022-11-02 18:04:46.224 24934-24972/com.psw.rxtest2 E/첫 번째: 3
2022-11-02 18:04:46.225 24934-24973/com.psw.rxtest2 E/두 번째: 0
2022-11-02 18:04:47.224 24934-24972/com.psw.rxtest2 E/첫 번째: 4
2022-11-02 18:04:47.226 24934-24973/com.psw.rxtest2 E/두 번째: 1
2022-11-02 18:04:48.224 24934-24972/com.psw.rxtest2 E/첫 번째: 5
2022-11-02 18:04:48.226 24934-24973/com.psw.rxtest2 E/두 번째: 2
2022-11-02 18:04:49.224 24934-24972/com.psw.rxtest2 E/첫 번째: 6
2022-11-02 18:04:49.227 24934-24973/com.psw.rxtest2 E/두 번째: 3
2022-11-02 18:04:50.224 24934-24972/com.psw.rxtest2 E/첫 번째: 7
2022-11-02 18:04:50.228 24934-24973/com.psw.rxtest2 E/두 번째: 4
2022-11-02 18:04:51.223 24934-24972/com.psw.rxtest2 E/첫 번째: 8
2022-11-02 18:04:51.225 24934-24973/com.psw.rxtest2 E/두 번째: 5

 

이러한 결과가 나올 겁니다.

Log가 찍힌 시간을 보면 18시04분43초에 첫번째 아이템이 0이라고 나옵니다.

18시04분44초 첫 번째 1

18시04분45초 첫 번째 2

18시04분46초 첫 번째 3

18시04분46초 두 번째 0

이라고 결과가 나옵니다.

 

이것이 Cold Observable입니다.

구독한 시점부터 아이템을 처음부터 발행합니다.

 

 

 

Hot Observable(publish, connect)

	ConnectableObservable src = Observable.interval(1, TimeUnit.SECONDS)
                .publish();
        src.connect();
        src.subscribe(value -> Log.e("첫 번째",value.toString()));
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        src.subscribe(value -> Log.e("두 번째",value.toString()));

 

ConnectableObservable 은 Hot Observable을 구현할 수 있도록 도와주는 타입이다.

ConnectableObservable을 바로 구독해도 데이터를 발행하지 않는다.

publish()를 통해 Hot Observable로 변환해주고 connect() 연산자를 호출해야만 아이템 발행을 하기 시작한다.

2022-11-02 18:48:19.681 26602-26638/com.psw.rxtest2 E/첫 번째: 0
2022-11-02 18:48:20.682 26602-26638/com.psw.rxtest2 E/첫 번째: 1
2022-11-02 18:48:21.682 26602-26638/com.psw.rxtest2 E/첫 번째: 2
2022-11-02 18:48:22.681 26602-26638/com.psw.rxtest2 E/첫 번째: 3
2022-11-02 18:48:22.682 26602-26638/com.psw.rxtest2 E/두 번째: 3
2022-11-02 18:48:23.681 26602-26638/com.psw.rxtest2 E/첫 번째: 4
2022-11-02 18:48:23.681 26602-26638/com.psw.rxtest2 E/두 번째: 4
2022-11-02 18:48:24.681 26602-26638/com.psw.rxtest2 E/첫 번째: 5
2022-11-02 18:48:24.681 26602-26638/com.psw.rxtest2 E/두 번째: 5
2022-11-02 18:48:25.682 26602-26638/com.psw.rxtest2 E/첫 번째: 6
2022-11-02 18:48:25.682 26602-26638/com.psw.rxtest2 E/두 번째: 6

이러한 결과가 나올 것이다.

3초 동안 잠시 멈춘 이후 두 번째 구독을 했다. Cold Observable과 달리 3부터 시작을 한 것을 볼 수가 있다.

 

 

 

autoConnect

	Observable<Long> src = Observable.interval(1, TimeUnit.SECONDS)
                        .publish()
                        .autoConnect(2);
        src.subscribe(value -> Log.e("첫 번째",value.toString()));
        src.subscribe(value -> Log.e("두 번째",value.toString()));

autoConnect 연산자는 connect 연산자를 호출하지 않더라고 구독 시에 즉각 아이템을 발행할 수 있도록 한다.

autoConnect의 매개변수는 구독자 수 다.

autoConnect(2) 라고 하면 구독자가 2개 이상 있어야 아이템을 발행한다.

autoConnect(1) 이어도 구독자가 2개 이상이기 때문에 아이템을 발행할 것이고 만약 autoConnect(3) 이면 아이템을 발행하지 않을 것이다.

만약 매개변수를 지정하지 않는다면 autoConnect(1)과 동일하게 동작한다고 한다.

 

다음 시간에는 Disposable에 대해 알아보겠습니다.

수고하셨습니다!

 

 

 

 

참고 자료

https://blog.yena.io/studynote/2020/11/08/Android-RxJava(3).html

 

 

반응형