RxJava - Observable, Observer, Disposable

Ddudduu·2021년 12월 17일
0

RxJava 의 주요 클래스인 Observer, Observable, Disposable 을 알아보려고 한다.

Observable

  • Item 이나 Sequence 를 방출(emit) 한다.

Observer

  • Observable 이 내보낸 Item 을 받아서 작업을 수행한다.
  • Observable 을 구독한다.
    => 그래야만 Observable 이 내보내는 Item 들을 받아올 수 있다!

마블 다이어그램

Rx 관련 문서를 보다보면 마블 다이어그램을 정말 많이 볼 수 있는데,
데이터의 흐름을 확인할 수 있는 그림이다.

  • ➡️ 실선 화살표 (상단) : Observable 의 timeline. 저 선 자체를 Observable 로 보는 것 같음!
    왼쪽에서 오른쪽으로 갈수록 (시간이 흐를수록) item 들이 나오고 있는 것 볼 수 있다.

- ⭐️🔺🟢🟦 도형들 : Observable 이 내보낸 item 들 (데이터)

  • ➡️ 화살표의 세로선 : Observable 이 성공적으로 (정상적으로) 종료됨을 알려준다.
    더 이상 item 을 내보내지 않는다.

  • 점선 화살표 & 박스 📦 : Observable 에 tranformation 이 적용되었다! 라는 걸 의미한다.
    박스의 'flip' 과 같은 텍스트는 어떻게 변형할 건지를 나타낸다.
    그림을 보면, 박스를 거쳐서 나온 도형들이 뒤집어져 있다. 'flip' 박스를 통과했으니 뒤집힌 도형들이 나오는 것!

  • ➡️ 실선 화살표 (하단) : 변형된 결과를 나타내는 Observable

  • ❌ 표시 : Observable 이 비정상적으로 종료된다면, 세로선 대신 X 로 표시한다.



그렇다면, Observable 과 Observer 를 어떻게 연결지을까?

subscribe(), Disposable

🗞신문을 생각해보자.
관심있는 신문사가 있어서 매일 신문을 읽고 싶다면, 어떻게 해야될까?
신문사에 구독 신청을 해야한다.

Rx 에서도 똑같다! 신문을 발행하는 신문사가 Observable, 신문을 전달받는 나를 Observer 로 대입해보면 똑같다.

Observable : 매일 신문을 발행 == 데이터, item 을 방출
Observer : 신문을 전달 받음 == 데이터를 받아서 작업을 수행

subscribe()

이 함수를 호출해 구독을 시작한다.
이걸 호출해야만, Observable 이 발행하는 데이터를 Observer 가 받아서 써먹을 수 있음!

Disposable

  • subscribe() 함수를 살펴보면,
public final Disposable subscribe(@NonNull Action onComplete) {
        Objects.requireNonNull(onComplete, "onComplete is null");

        CallbackCompletableObserver observer = new CallbackCompletableObserver(onComplete);
        subscribe(observer);
        return observer;
    }

Disposable 객체를 반환한다.

신문을 보다가 더이상 받고싶지 않다면, 구독 취소를 하면 된다.
이처럼 프로그래밍에서도 더이상 데이터를 전달 받지 않으려면 구독을 해제해야하는데, Disposable 을 통해 구독 해제 하면 된다!

void dispose();

을 통해서 구독을 해제할 수 있다.
더 이상 필요하지 않을 때 구독을 해제하면, 메모리 누수를 막을 수 있다

CompositeDisposable

  • 여러 Disposable 을 모아서 처리할 수 있다. 한 번에 dispose() 하기 좋음.

How to use?

변수명.subscribe { 구독 후, 처리할 작업 }
    .addTo(CompositeDisposable)

이런 형태로 사용하면 된다.

Observable 의 알림 이벤트

  1. onNext() : 새로운 item 을 내보낼 때마다 호출한다. 데이터가 바뀌었다고 알려주는 역할.
  2. onCompleted() : 데이터 전달이 끝났을 때 호출한다.
  3. onError() : 오류가 발생했을 때 호출한다. 요게 호출되면, onNext() 나 onCompleted() 는 더이상 호출되지 않는다.
profile
Android

0개의 댓글