오늘은 Rxjava의 핵심 Observable을 공부해보려고 합니다. 내용이 많아서 단일 데이터와 다중일 때를 나눠서 공부해보도록 하겠습니다~!
RxJava 2.x
- Observable, Maybe, Flowable
Observable 클래스
- Observable은 옵서버 패턴을 구현하며, 옵서버 패턴은 객체의 상태 변화를 관찰하는 관찰자 목록을 객체 등록.
- 상태 변화가 있을 때마다 메서드를 호출하여 객체가 직접 목록의 각 옵서버에서 변화를 알려준다.
💡Observable이 전달하는 세 가지의 알림
onNext : Observabled이 데이터의 발행을 알림
onComplete : 모든 데이터의 발행을 완료했음을 알리고, 단 한 번만 발생하며 발생한 후에는 더 이상 OnNext 이벤트가 발생해서는 안된다.
onError : 에러가 발생했음을 알리고 Observable의 실행을 종료
just() 함수
- 인자로 넣은 데이터를 차례로 발행하려고 Observable을 생성
- 데이터 내용을 변경하지 않고 그대로 발행
Subscribe() 함수와 Disposable 객체
1.Subscribe()
- Observable은 just() 등의 팩토리 함수로 데이터 흐름을 정의한 후 subscribe() 함수를 호출해야 실제로 데이터를 발행
⇒ 실행되는 시점을 조절할 수 있습니다. - SubScribe() 함수의 원형
-
- Disposable subscribe()
- Disposable subscribe(Consumer<? super T> onNext)
- Disposable subscribe(Consumer<? super T> onNext, Consumer<? super java.lang.Throwable> onError)
-
- 인자가 없는 subscribe()함수는 onNext와 onComplete 이벤트를 무시하고 onError 이벤트가 발생했을 때만 OnErrorNotImplementedException을 던집니다(throw). 따라서 Observable로 작성한 코드를 테스트하거나 디버깅할 때 사용합니다.
- 인자가 1개있는 오버 로딩은 onNext 이벤트를 처리합니다. onError 이벤트가 발생했을 때 OnErrorNotImplementedException을 던집니다.(throw)
- 인자가 2개인 함수는 onNext와 onError 이벤트를 처리합니다.
- 인자가 3개인 함수는 onNext, onError, onComplete 이벤트를 모두 처리합니다.
이러한 함수 원형은 모두 Disposable 인터페이스 객체를 리턴합니다.
- void dispose()
- boolean isDisposed()
2. Disposable() 함수
- dispose()는 Observable에게 더 이상 데이터를 발행하지 않도록 구독을 해지하는 함수
- Observable()이 onComplete 알림을 보냈을 때 자동으로 dispose()를 호출해 Observable과 구독자의 관계를 끊습니다.
- isDiosposed()를 이용하여 구독을 해지했는지 확인할 수 있습니다.
create() 함수
Observable<T> create(ObservableOnSubscribe<T> source)
Observable<Integer> source = Observable.create(
(Observableemitter<Integer> emitter) -> {
emitter.onNext(100);
emitter.onNext(200);
emitter.onNext(300);
emitter.onComplete();
});
source.subscribe(System.out::println);
💊 source변수는 차가운 Observable로 첫 번째 문장으로만 데이터를 발행하지 않고 subscribe를 호출했을 때 값을 발행합니다.
Observable.create()를 사용할 때의 주의 사항
- 구독 해지(dispose)되었을 때 등록된 콜백을 모두 해제해야 합니다.(메모리 누수 발생할 수 있음)
- 구독자가 구독하는 동안 OnNext와 oncomplete 이벤트를 호출해야 합니다.
- 에러가 발생했을 때는 오직 onError이벤트로만 에러를 전달해야 합니다.
- 배압(back pressure)을 직접 처리해야 합니다.
'RxJava' 카테고리의 다른 글
[RxJava] Observable - (2) (0) | 2022.10.21 |
---|---|
[RxJava] 기본 개념 (0) | 2022.10.21 |