just() 함수는 데이터를 넣으면 자동으로 알림 이벤트가 발생하지만,
create() 함수는 onNext, onComplete, onError 같은 알림을 개발자가 직접 호출해야한다.
그래서 create()는 라이브러리가 무언가를 해준다기보다 개발자가 무언가 직접 하는 느낌이 강한 함수이다.
위의 그림은 create() 함수의 마블 다이어그램이다.
구독자에게 데이터를 발행하려면, onNext() 함수를 호출해야하고,
모든 데이터를 발행한 후에는 반드시 onComplete() 함수를 호출해야한다.
Observable<Integer> source = Observable.create(
(ObservableEmitter<Integer> emitter)->{
emitter.onNext(100);
emitter.onNext(200);
emitter.onNext(300);
emitter.onComplete();
});
source.subscribe(data -> System.out.println(data));
결과값
100
200
300
Observable 클래스 타입인 source 변수에서 onNext()함수를 호출해서 차례대로 100, 200, 300이라는 데이터를 발행했다.
그리고, onComplete()함수를 호출해서 데이터 발행을 완료했다.
또한 첫 예제와 다르게
[첫예제 참고]
Observable.just("Hello", "RxJava2!!")
.subscribe(System.out::println);
Observable<Integer>타입의 source 변수를 분리했는데 이때, source 변수는 Cold Observable(차가운 옵저버블)이 된다.
즉, 첫번째 문장만으로는 실제 데이터를 발행하지 않고, 두번째 문장에서 subscribe() 함수를 호출 했을 때 100, 200, 300의 값을 발행한다.
*참고로, create() 함수의 인자는 원래 ObservableOnSubscribe 인터페이스 타입이어야 한다. 근데..
위의 코드에서는 ObservableEmitter 인터페이스 객체를 인자로 받는 람다식으로 처리했다.
람다 표현식을 사용하면 Obseverble.create()를 호출할 때 불필요한 익명 객체나, 멤버 변수를 기재하지 않고 꼭 필요한 변수만 소스 코드에 작성하면 되기에 가독성이 높아지게 된다.
*System.out::println은 메서드 레퍼런스라고 한다.
람다식으로 data -> System.out.println(data)를 줄인 것이다.
람다 표현식과 메서드 레퍼런스를 사용할 때는 다음 우선순위를 고려해보고 판단하기를 권한다.
1. 메서드 레퍼런스로 축약할 수 있는 확인
2. 그 다음 람다 표현식을 활용할 수 있는지 확인
3. 1~2를 활용할 수 없으면 익명 객체나 맴버 변수로 표현
아래와 같이 세가지로 구분하여 사용이 가능하다.
Observable<Integer> source = Observable.create(
emitter -> {
emitter.onNext(100);
emitter.onNext(200);
emitter.onNext(300);
});
//메소드 레퍼런스로 축약 사용
// source.subscribe(System.out::println);
//람다로 사용
// source.subscribe(data -> System.out.println(data));
//익명객체로 사용
source.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer data) throws Exception {
System.out.println(data);
}
});
익명객체를 사용할 경우 subscribe()의 원형도 알아야하고, Consumer<T> 클래스의 메서드도 매번 입력을 해주어야해서 번거롭다. 또, T 타입을 맞추는 것도 까다롭기에 메서드 레퍼런스 또는 람다식을 잘 활용해보자.
** create()를 사용할 때는 주의해야한다.
왜냐하면 구독해지(dispose)되었을 때 등록된 콜백을 모두 해제해야하고, 구독자가 구독하는 동안에만 onNext()와 onComplete 이벤트를 호출해야하기에 예외 처리를 잘해야한다. 또한 에러 발생시 onError 이벤트로 에러를 전달해야하고, back pressure(배압) 또한 직접 처리해야한다.
사용하려면, 익숙한 사용자에게 유용할 것같다.
그림 참고 : http://reactivex.io/documentation/operators/create.html
'프로그래밍 > RxJava' 카테고리의 다른 글
[RxJava] Observable - fromIterable()함수 (0) | 2020.02.16 |
---|---|
[RxJava] Observable - fromArray() 함수 (0) | 2020.02.16 |
[RxJava]Observable - just()함수 (0) | 2020.02.11 |
[RxJava] Observable 클래스 (0) | 2020.02.11 |
[RxJava] 마블 다이어그램 보는 방법 (0) | 2020.02.11 |