본문 바로가기

안드로이드

안드로이드 RxJava #4 Disposable

 

안녕하세요

이번 시간에는 Disposable에 대해 알아보겠습니다

 

RxJava #2에서 onComplete()를 통해 데이터 발행이 끝났음을 알렸습니다.

Disposable도 비슷한 역할을 합니다.

 

데이터 발행을 언제 까지 할 건지 알고 있는 상황에서는 onComplete()를 이용하면 됩니다.

하지만 무한하게 아이템을 발행하거나 오랫동안 실행되는 Observable의 경우에는 사용자의 액션 또는 안드로이드 컴포넌트 생명주기와 관련해서 이미 활성화되었다면 구독이 더는 필요하지 않을 수 있다. 이럴 때는 메모리 누수 방지를 위해 명시적인 폐기 dispose가 필요하다.

 

disposable.dispose();

메서드를 호출하면 언제든지 아이템 발행을 중단할 수 있다.

 

 

https://adc6981.tistory.com/17

 

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

안녕하세요 이번 시간에는 Cold Observable과 Hot Observable에 대해 알아보겠습니다. Observable을 구현하는 방식에는 2가지가 있습니다. 미묘한 차이지만 전혀 다른 결과를 보여줍니다. Cold Observable과 Hot O

adc6981.tistory.com

 

이전 시간에 만들었던 Cold Observable을 조금 변경해 보자.

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

 

2022-11-04 15:23:30.359 28775-28811/com.psw.rxtest2 E/첫 번째: 0
2022-11-04 15:23:31.358 28775-28811/com.psw.rxtest2 E/첫 번째: 1
2022-11-04 15:23:32.359 28775-28811/com.psw.rxtest2 E/첫 번째: 2
2022-11-04 15:23:33.361 28775-28812/com.psw.rxtest2 E/두 번째: 0
2022-11-04 15:23:34.360 28775-28812/com.psw.rxtest2 E/두 번째: 1
2022-11-04 15:23:35.360 28775-28812/com.psw.rxtest2 E/두 번째: 2
2022-11-04 15:23:36.361 28775-28812/com.psw.rxtest2 E/두 번째: 3
2022-11-04 15:23:37.360 28775-28812/com.psw.rxtest2 E/두 번째: 4
2022-11-04 15:23:38.361 28775-28812/com.psw.rxtest2 E/두 번째: 5

 이러한 결과를 볼 수 있다.

1초에 한번씩 아이템을 발행하다가 sleep(3000) 이후 두 번째 구독이 실행되고, 첫 번째 아이템 발행이 종료되면서 출력이 멈춘 것을 확인할 수 있다.

 

 

 

CompositeDisposable

CompositeDisposable를 통해서 여러개의 Disposable을 처리할 수 있다.

 

Observable src = Observable.interval(1, TimeUnit.SECONDS);
        Disposable disposable1 = src.subscribe(value -> Log.e("첫 번째",value.toString()));
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Disposable disposable2 =src.subscribe(value -> Log.e("두 번째",value.toString()));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        CompositeDisposable cd = new CompositeDisposable();
        cd.add(disposable1);
        cd.add(disposable2);

        cd.dispose();

 

2022-11-04 15:30:37.903 29284-29321/com.psw.rxtest2 E/첫 번째: 0
2022-11-04 15:30:38.905 29284-29321/com.psw.rxtest2 E/첫 번째: 1
2022-11-04 15:30:39.904 29284-29321/com.psw.rxtest2 E/첫 번째: 2
2022-11-04 15:30:40.904 29284-29321/com.psw.rxtest2 E/첫 번째: 3
2022-11-04 15:30:40.906 29284-29322/com.psw.rxtest2 E/두 번째: 0

마지막 sleep(1000)을 통해서 1초 이후 CompositeDisposable를 이용해서 아이템 발행을 중단 한것이다.

여러 개를 add 하기 귀찮다면

cd.addAll(disposable1,disposable2);

이렇게 한 번에 처리하는 방법도 있다.

 

 

 

다음 시간에는 마블 다이어그램 보는 방법과 RxJava의 연산자에 대해 알아보겠습니다.

수고하셨습니다!

반응형