매거진 ReactiveX

You can make anything
by writing

C.S.Lewis

by 한로니 Jun 25. 2016

RxJava, 파라오 슬롯과 생명주기

옵저버블에는 생명주기가 있다. 이 생명주기는 옵저버에 의해 구독, 구독해지 또는아이템을 발행하거나발행이 끝나면 완료가 되는 일련의 상태로 볼 수 있다. Rx에서는 각각의 상태에 대응하는 콜백을 등록할 수 있는데 이런 생명주기 콜백이 호출되는 시점을 정리해보았다. 이 콜백들을 응용하는 방법은GrokkingAndoid의 글이 도움된다.


doOnSubscribe

doOnSubscribe() 함수는 옵저버블이 구독될 때 호출되는 콜백 함수를 등록할 수 있다.

파라오 슬롯

샘플 코드

파라오 슬롯<Integer source = 파라오 슬롯.just(0)

.doOnSubscribe(() - System.out.println("doOnSubscribe"));


source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

doOnSubscribe

Next: 0

Completed


doOnUnsubscribe

doOnUnsubscribe() 함수는 옵저버블이 구독 해지될 때 호출되는 콜백 함수를 등록할 수 있다.

파라오 슬롯

샘플 코드

파라오 슬롯<Integer source = 파라오 슬롯.just(0)

.doOnUnsubscribe(() - System.out.println("doOnUnsubscribe"));

Subscription subscription = source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));

subscription.unsubscribe();


결과

Next: 0

Completed

doOnUnsubscribe


doOnNext

doOnNext() 함수는 옵저버블이 아이템을 발행할 때 호출되는 콜백 함수를 등록할 수 있다.

파라오 슬롯

샘플 코드

파라오 슬롯<Integer source = 파라오 슬롯.just(0, 1, 2)

.doOnNext(i - System.out.println("doOnNext: " + i));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

doOnNext: 0

Next: 0

doOnNext: 1

Next: 1

doOnNext: 2

Next: 2

Completed


doOnCompleted

doOnCompleted() 함수는 옵저버블이 완료를 발행할 때 호출되는 콜백 함수를 등록할 수 있다.

샘플 코드

파라오 슬롯<Integer source = 파라오 슬롯.just(0)

.doOnCompleted(() - System.out.println("doOnCompleted"));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

Next: 0

doOnCompleted

Completed


doOnError

doOnError() 함수는 옵저버블이 에러를 발행할 때 호출되는 콜백 함수를 등록할 수 있다.

샘플 코드

파라오 슬롯<Integer source = 파라오 슬롯.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 - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.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

doOnEach() 함수는 옵저버블이 아이템, 에러, 완료를 발행할 때 호출되는 콜백 함수를 등록할 수 있다. 파라미터로Notification 객체가 전달되고, 이 객체를 통해 아이템과 이벤트 타입을 알 수 있다.

샘플 코드

파라오 슬롯<Integer source = 파라오 슬롯.just(0)

.doOnEach(notification - System.out.println("doOnEach: " + notification));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

doOnEach: [rx.Notification@133c40ae OnNext 0]

Next: 0

doOnEach: [rx.Notification@df4db0e OnCompleted]

Completed


doOnTerminate

doOnTerminate() 함수는 옵저버블이 에러, 완료를 발행할 때 호출되는 콜백 함수를 등록할 수 있다.

샘플 코드 1

파라오 슬롯<Integer source = 파라오 슬롯.just(0)

.doOnTerminate(() - System.out.println("doOnTerminate"));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

Next: 0

doOnTerminate

Completed


샘플 코드 2

파라오 슬롯<Object source = 파라오 슬롯.error(new Error("Unknown error"))

.doOnTerminate(() - System.out.println("doOnTerminate"));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

doOnTerminate

Error: java.lang.Error: Unknown error


doAfterTerminate

doAfterTerminate() 함수는 옵저버블이 에러, 완료를 발행 후 호출되는 콜백 함수를 등록할 수 있다.

샘플 코드 1

파라오 슬롯<Integer source = 파라오 슬롯.just(0)

.doAfterTerminate(() - System.out.println("doAfterTerminate"));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

Next: 0

Completed

doAfterTerminate


샘플 코드 2

파라오 슬롯<Object source = 파라오 슬롯.error(new Error("Unknown error"))

.doAfterTerminate(() - System.out.println("doAfterTerminate"));

source.subscribe(

i - 파라오 슬롯.out.println("Next: " + i),

e - 파라오 슬롯.err.println("Error: " + e),

() - System.out.println("Completed"));


결과

Error: java.lang.Error: Unknown error

doAfterTerminate

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari