brunch

매거진 ReactiveX

You can make anything
by writing

C.S.Lewis

by 한로니 Jun 25. 2016

RxJava, Observable과 생명주기

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


doOnSubscribe

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

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

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

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

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

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

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

샘플 코드 1

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


샘플 코드 2

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

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

샘플 코드 1

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


샘플 코드 2

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

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