오늘은 Rxjava의 핵심 Observable을 공부해보려고 한다.
내용이 많은 것 같아서 단일데이터와 다중일때를 나눠서 작성!
RxJava 2.x
- Observable, Maybe, Flowable
Observable 클래스
-
Observable은 옵서버 패턴을 구현하며, 옵서버 패턴은 객체의 상태 변화를 관찰하는 관찰자 목록을 객체 등록.
-
상태 변화가 있을 때마다 메서드를 호출하여 객체가 직접 목록의 각 옵서버에세 변화를 알려준다.
💡Observable이 전달하는 세 가지의 알림
onNext
: Observabled이 데이터의 발행을 알림
onComplete
: 모든 데이터의 발행을 완료했음을 알리고, 단 한 번만 발생하며 발생한 후에는 더 이상 OnNext 이벤트가 발생해서는 안된다.
onError
: 에러가 발생했음을 알리고 Observable의 실행을 종료
just() 함수
- 인자로 넣은 데이터를 차례로 발행하려고 Observable을 생성
- 데이터 내용을 변경하지 않고 그대로 발행
Subscribe() 함수와 Disposable 객체
Subcribe() 함수
- 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()
Disposable() 함수
- dispose()는 Observable에게 더 이상 데이터를 발행하지 않도록 구독을 해지하는 함수
- Observable()이 onComplete 알림을 보냈을 때 자동으로 dispose()를 호출해 Observable과 구독자의 관계를 끊음.
- isDiosposed()를 이용하여 구독을 해지했는지 확인할 수 있음.
create() 함수
- 개발자가 직접 OnNext, onComplete. onError같은 알림을 직접 호출해야한다.
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)을 직접 처리해야 함.