옵저버블에는 생명주기가 있다. 이 생명주기는 옵저버에 의해 구독, 구독 해지 또는 아이템을 발행하거나 발행이 끝나면 완료가 되는 일련의 상태로 볼 수 있다. Rx에서는 각각의 상태에 대응하는 콜백을 등록할 수 있는데 이런 생명주기 콜백이 호출되는 시점을 정리해보았다. 이 콜백들을 응용하는 방법은 Grokking Andoid의 글이 도움된다.
doOnSubscribe() 함수는 옵저버블이 구독될 때 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0)
.doOnSubscribe(() -> System.out.println("doOnSubscribe"));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
doOnSubscribe
Next: 0
Completed
doOnUnsubscribe() 함수는 옵저버블이 구독 해지될 때 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0)
.doOnUnsubscribe(() -> System.out.println("doOnUnsubscribe"));
Subscription subscription = source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
subscription.unsubscribe();
Next: 0
Completed
doOnUnsubscribe
doOnNext() 함수는 옵저버블이 아이템을 발행할 때 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0, 1, 2)
.doOnNext(i -> System.out.println("doOnNext: " + i));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
doOnNext: 0
Next: 0
doOnNext: 1
Next: 1
doOnNext: 2
Next: 2
Completed
doOnCompleted() 함수는 옵저버블이 완료를 발행할 때 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0)
.doOnCompleted(() -> System.out.println("doOnCompleted"));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
Next: 0
doOnCompleted
Completed
doOnError() 함수는 옵저버블이 에러를 발행할 때 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0, 1)
.doOnNext(i -> {
if (i > 0) {
throw new RuntimeException("Item exceeds maximum value");
}
})
.doOnError(e -> System.err.println("doOnError" + e));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
Next: 0
doOnError: java.lang.RuntimeException: Item exceeds maximum value
Error: java.lang.RuntimeException: Item exceeds maximum value
doOnEach() 함수는 옵저버블이 아이템, 에러, 완료를 발행할 때 호출되는 콜백 함수를 등록할 수 있다. 파라미터로 Notification 객체가 전달되고, 이 객체를 통해 아이템과 이벤트 타입을 알 수 있다.
Observable<Integer> source = Observable.just(0)
.doOnEach(notification -> System.out.println("doOnEach: " + notification));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
doOnEach: [rx.Notification@133c40ae OnNext 0]
Next: 0
doOnEach: [rx.Notification@df4db0e OnCompleted]
Completed
doOnTerminate() 함수는 옵저버블이 에러, 완료를 발행할 때 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0)
.doOnTerminate(() -> System.out.println("doOnTerminate"));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
Next: 0
doOnTerminate
Completed
Observable<Object> source = Observable.error(new Error("Unknown error"))
.doOnTerminate(() -> System.out.println("doOnTerminate"));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
doOnTerminate
Error: java.lang.Error: Unknown error
doAfterTerminate() 함수는 옵저버블이 에러, 완료를 발행 후 호출되는 콜백 함수를 등록할 수 있다.
Observable<Integer> source = Observable.just(0)
.doAfterTerminate(() -> System.out.println("doAfterTerminate"));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
Next: 0
Completed
doAfterTerminate
Observable<Object> source = Observable.error(new Error("Unknown error"))
.doAfterTerminate(() -> System.out.println("doAfterTerminate"));
source.subscribe(
i -> System.out.println("Next: " + i),
e -> System.err.println("Error: " + e),
() -> System.out.println("Completed"));
Error: java.lang.Error: Unknown error
doAfterTerminate