RxJava 2부터 Disposable 형태로 변경됐다.
일반적인 형태로 많이 쓰는건 consumer 형태이다.
예를 보자.
Observable<Integer> testObservable = Observable.range(1 , 10);
Disposable disposable1 = testObservable
.doOnDispose(() -> System.out.println("onDispse 1"))
.doOnComplete(() -> System.out.println("onCompleted 1"))
.subscribe(item -> System.out.println("emitted 1 -> " + item)); //consumer 로 진행
System.out.println( "isDisposed -> " + disposable1.isDisposed());
..........
emitted 1 -> 1
emitted 1 -> 2
emitted 1 -> 3
emitted 1 -> 4
emitted 1 -> 5
emitted 1 -> 6
emitted 1 -> 7
emitted 1 -> 8
emitted 1 -> 9
emitted 1 -> 10
onCompleted 1
isDisposed -> true <- 이미 dispose가 되었다.
consumer 사용시 doOnDispose 이벤트가 안 타지만 이미 dispose가 된걸 볼 수 있다.
하지만 이런 경우를 보자.
public static DisposableObserver<Integer> getDispose(int pos){
DisposableObserver<Integer> disposableObserver = new DisposableObserver<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("emitted " + pos + " -> " + item);
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onComplete() {
System.out.println("onComplete");
}
};
return disposableObserver;
}
testObservable
.doOnDispose(() -> System.out.println("onDispse 2"))
.doOnComplete(() -> System.out.println("onCompleted 2"))
.subscribe(getDispose(2));
disposableObser를 제공시 void 형태라서 메모리릭이 걸릴수 있다.
그럴때
.subscribe(getDispose(3));
- CompositeDispoable 을 호출해서 destory 시 clear를 해준다.
- .dispose() 를 해서 제거를 해준다.
Disposable disposable3 = testObservable
.doOnDispose(new Action() {
@Override
public void run() throws Exception {
System.out.println("onDispse 3");
}
})
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
System.out.println("onCompleted 3");
}
})
.subscribeWith(getDispose(3));
compositeDisposable.add(disposable3);
compositeDisposable.clear(); // or disposable3.dispose();