세상을 바꾸는 개발자

[RxJava] publish 연산자와 connect 연산자 본문

안드로이드/RxJava

[RxJava] publish 연산자와 connect 연산자

헬창코딩 2021. 8. 27. 20:40

안녕하세요~ 헬창코딩입니다.

오늘은  publish 연산자와 connect 연산자에 대해서 알아보도록 하겠습니다~

 

ConnectableObservable은 Hot Observable을 구현할 수 있도록 도와주는 타입으로 아무 Observable 타입이나 publish 연산자를

이용하여 간단히 ConnectableObservable로 변환할 수 있습니다. (Hot Observable은 저번 시간 포스트를 참고해주세요)

 

ConnectableObservable은 구독을 요청해도 Observable은 데이터를 발행하지 않습니다. 

connect() 연산자를 호출할 때 비로소 아이템을 발행하기 시작합니다. 

            ConnectableObservable<Long> src = Observable.interval(1, TimeUnit.SECONDS).publish();
            src.connect();
            src.subscribe(data -> Log.d("log_test", "#1::" + data));
            Thread.sleep(3000);
            src.subscribe(data -> Log.d("log_test", "#2::" + data));
            Thread.sleep(3000);

결과

 

첫 번째 구독시에 3초 동안 0~2초 까지 발행하고, 3초 뒤에는 두 번째 구독자가 추가도 있는데, 두 번째 구동자는 0~2는 수신하지 못하고

3부터 수신하는 것을 확인할 수 있습니다.

 

 

autoConnect 연산자 

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

autoConnect 연산자의 매개변수는 아이템을 발행하는 구독자 수로, 만약 autoConnect(2)라고 하면, 구독자가 2개 이상 붙어야 아이템을 발행하기 시작합니다. 

   Observable<Long> src =
                Observable.interval(100, TimeUnit.MILLISECONDS)
                        .publish()
                        .autoConnect(2);

        src.subscribe(data -> Log.d("log_test", "A#::" + data));
        src.subscribe(data -> Log.d("log_test", "B#::" + data));

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

 

결과

여기서 만약 src.subscriber()를 한 번만 호출했다면 아이템을 발행하지 않아 콘솔에 아무것도 출력되지 않습니다.

autoConnect()의 매개 변수로 0 이하를 입력하면 구독자 수와 관계없이 곧바로 아이템 발행을 시작합니다.

 

만약 autoConnect 연산자의 매개 변수를 지정하지 않는다면 autoConnect(1)과 동일하게 동작하며,

구독하자마자 아이템 발행을 시작합니다.

 

 

 

 

 

 

 

 

 

 

 

Comments