본문 바로가기

안드로이드/RxAndroid(RxJava)

[RxJava] Disposable

Disposable

저번까지의 포스트에서 Observable 객체에서 발행할 아이템을 정의하고 subcribe()를 통해 스트림을 생성하고 아이템을 발행했다. 사실, subscribe()를 호출한 후에는 Disposable 객체가 반환된다.

Observable source = Observable.just(1,2,3);
Disposable disposable = source.subsribe(o -> System.out.println(source));

 

유한개의 아이템을 발행하는 Observable의 경우 onComplete() 호출로 안전하게 종료된다. 하지만 아이템을 끝없이 발행하거나 오랫동안 실행되는 경우 제대로 종료되지 않는다면 메모리 릭(leak)이 발생할 수 있다. 따라서, 명시적인 폐기가 필요하다. 이는 반환된 Disposal의 dispose()를 호출하여 아이템의 발행을 중단할 수 있다.

Observable source = Observable.interval(1, TimeUnit.SECONDS);
Disposable disposable = source.subscribe(System.out::println);
new Thread(()->{
	try {
    	Thread.sleep(3500);
    } catch(Exception e) {
    	e.printStackTrace();
    }
    disposable.dispose();
}).start()

//실행결과
0
1
2

앞선 포스트 처럼 interval을 주기적으로 아이템을 발행하는 연산자이다. 이는 무한히 발행되기 때문에 어느 시점에서는 폐기가 필요하다. 따라서 쓰레드를 통해 3.5초 뒤에 dispose()하여 아이템의 발행을 중지시키고 모든 리소스를 폐기한다. 만약 onComplete()를 명시적으로 표기하거나 호출하는 것을 보장한다면 굳이 dispose()를 호출할 이유는 없다.

 

CompositeDisposable

만약 구독자가 여러 곳에 존재하고, 이들을 모두 폐기하려면 각각의 Disposable 객체에 대해서 dispose()를 호출해야 한다. RxJava는 이를 편리하게 처리하기 위해 CompositeDisposable을 제공한다.

Observable source = Observable.interval(1,TimeUnit.SECONDS);
Disposable d1 = source.subscribe(System.out::println);
Disposable d2 = source.subscribe(System.out::println);
Disposable d3 = source.subscribe(System.out::println);

CompositeDisposable cd = new CompositeDisposable();
cd.add(d1); cd.add(d2) cd.add(d3);
//또는 cd.addAll(d1,d2,d3);

cd.dispose(); //전부 페기

안드로이드의 경우 생명주기에 맞춰 onDestroy()에서 compositeDisposable의 dispose()를 호출에 모든 자원을 폐기하는 방식으로 활용한다.

 

 

Reference

  • 아키텍처를 알아야 앱 개발이 보인다.

'안드로이드 > RxAndroid(RxJava)' 카테고리의 다른 글

[RxJava] Scheduler  (0) 2020.12.25
[RxJava] Cold Observable과 Hot Observable  (0) 2020.12.22
[RxJava] Observable  (0) 2020.12.21
[RxJava] 반응형 프로그래밍  (0) 2020.12.21