[RxJava] RxJava Cold vs Hot Observable

minnie·2022년 2월 17일
0

RxJava

목록 보기
3/8
post-thumbnail

📝RxJava의 학습 순서
1. Observable 클래스를 명확하게 이해(특히 Hot Observable과 Cold Observable의 개념을 꼭 이해해야함)
2. 변환, 제어, 결합 연산자 등 카테고리별 주요 함수 공부
3. 스케줄러의 의미, subscribeOn()과 observeOn()함수의 차이
4. 그 밖의 디버깅, 흐름 제어함수


Cold Observable vs Hot Observable

Observable의 사전 뜻을 찾아보면 관찰할 수 있는, 식별 가능한 이러한 의미를 가지고 있다.
즉, observable은 데이터의 흐름에 맞게 알림을 보내 Observer가 데이터를 사용할 수 있도록 한다.

Observable에는 Cold ObservableHot Observable이 있다.
일반적으로 우리가 사용하는 것들은 모두 Cold Observable이라고 한다.

⭐자세하게 보기전에 간단하게 유튜브로 Hot Observable과 Cold Observable의 차이를 설명하자면
Cold Observable은 Youtube 동영상을 재생하는 것 처럼, 구독한 순간부터 아이템을 발행시키는 것이고
Hot Observable은 Live 방송을 시청하는 것처럼, 구독하기 전 후 상관 없이 아이템 발행이 시작된 이후로 모든 구독자들에게 동시에 같은 아이템을 발행시키는 것이다.⭐

🌈 Cold Observable

Cold Observable은 Observer가 구독하는 동안 이벤트 방출을 한다. Observable을 생성하고 Observer가 subscribe를 호출할 때 까지 데이터 발행을 하지 않는다. 이러한 방식을 lazy하다고 한다. 원하는 시점에 데이터를 요청하고 처음부터 끝까지 결과를 받아온다.
Cold Observable의 종류 : Observable, Flowable, Single, Maybe, Completable
Cold Observable 예 : 데이터베이스 쿼리, 파일읽기, API 요청 등

아래 코드는 interval연산자를 통해 1초마다 아이템을 발행하는 Cold Observable의 예시이다.

    private void coldObservable(){
        Observable<Long> src = Observable.interval(1, TimeUnit.SECONDS);
        src.subscribe(value-> System.out.println("First: " + value));
        try {
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        src.subscribe(value-> System.out.println("Second: " + value));
        try {
            Thread.sleep(2500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

첫번째로 Observable을 구독하고, 2.5초후 후에 새로운 구독자로 다시 구독한 모습니다.
두 Observer 모두 처음부터 발행한 결과를 확인해볼 수 있다.

🌈 Hot Observable

Hot Observable은 구독 여부와 관계 없이 이벤트 방출한다.첫번째 구독자가 Observable을 구독한 몇 초 후에 두번째 구독자가 같은 Observable을 구독한다면, 둘은 동시에 같은 아이템을 수신하며 두번째 구독자는 구독 이전에 발행된 아이템을 놓칠 수도 있다.
Hot Observable의 종류 : subject, procssor
Hot Observable 예 : 안드로이드 UI 이벤트(버튼 클릭, 키보드 입력 등..)

Hot Observable을 구현하기 위한 방법에는 여러 가지가 있다.
그 중 하나로 ConnectableObservable이라는 특수한 유형의 Observable이 있다. ConnectableObservable은 구독을 요청해도 데이터를 곧바로 발행하지 않는다는 점이다.

우선 publish()연산자를 통해 일반적인 Observable을 Hot Observable로 변환한다. publish()만으로 아이템 replay가 활성화되지 않는다. connect() 연산자를 호출할 때에 비로소 아이템을 발행하기 시작한다.

ConnectableObservable<Long> src = Observable.interval(1,TimeUnit.SECONDS).publish();
src.connect();
src.subscribe(value->System.out.println("First: " +value));
try {
	Thread.sleep(2500);
} catch (InterruptedException e) {
	e.printStackTrace();
}
src.subscribe(value-> System.out.println("Second: " + value));
try {
	Thread.sleep(2500);
} catch (InterruptedException e) {
	e.printStackTrace();
}

첫번째 구독자는 2.5초 동안 0~2 아이템을 발행하고, 두번째 구독자는 2.5초 뒤 2부터 수신하는 것을 볼 수 있다.

connect()말고 autoConnect()라는 연산자도 존재한다.
autoConnect연산자는 connect()를 호출하지 않더라도 구독 즉시 아이템을 발행할 수 있도록 도와주는 연산자이다.

private void hotObservableAutoConnect(){
	System.out.println("AutoConnect Start");
	Observable<Long> src =
		Observable.interval(1,TimeUnit.SECONDS)
				.publish()
				.autoConnect(2);

	src.subscribe(value->System.out.println("First: " +value));
	try {
		Thread.sleep(2500);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	src.subscribe(value-> System.out.println("Second: " + value));
	try {
		Thread.sleep(2500);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

autoConnect 매개변수는 아이템을 발행하는 구독자의 수이다. autoConnect(2)라고 설정하고 첫번째 구독자는 바로 구독하고 두번째 구독자는 2.5초 뒤에 구독하는 코드이다.
구독자의 수인 2까지 채워지고 나서야 아이템이 발행되는 것을 확인할 수 있다. 0이하의 수를 입력하면 구독자 수와 관계 없이 곧바로 아이템 발행을 시작한다.

참고 : https://4z7l.github.io/2020/12/08/rxjava-4.html
https://blog.yena.io/studynote/2020/11/08/Android-RxJava(3).html

profile
Android Developer

0개의 댓글