Android/RxJava

[차근차근 RxJava 기록 2] Observable의 이벤트와 생성

c0de_h0ng 2022. 1. 21. 19:15
728x90

Observable을 구독하는 Observer가 존재하고 Observable이 순차적으로 발행하는 데이터에 대해서 onNext(), onComplete(), onError() 3가지 이벤트를 사용하여 반응을 한다. 3가지 이벤트는 Emitter라는 인터페이스에서 선언이 되며 데이터 및 오류는 null을 허용하지 않는다.

onNext()

Observable에서 Observer까지 한 번에 하나씩 순차적으로 데이터를 발행

onComplete()

데이터의 발행이 끝났음을 알리고 더 이상 onNext() 호출이 발생하지 않음

onError()

오류가 발생했음을 Observer에 전달

Observable 생성

Operator(연산자)라고 불리는 여러 정적 메서드를 통해 기존 데이터를 참조, 변형하여 Observable을 생성한다.

create() 연산자

create()연산자는 사용하면 Emitter를 이용하여 직접 데이터를 발행을 하며 발행 완료 및 오류의 알림을 직접 전달한다. 사용자가 직접 Emitter을 컨트롤하므로 주의가 필요하다. 예를 들어 Observable이 폐기되었을 때 disposable을 통해서 해지를 해야 한다. 만약 해지를 하지 않은 경우에는 메모리 누수가 발생한다.

val source: Observable<String> = Observable.create { emitter ->
    emitter.onNext("Hello")
    emitter.onNext("World")
    emitter.onComplete()
}
source.subscribe(System.out::println)

// Hello
// World

val source2: Observable<String> = Observable.create { emitter ->
    emitter.onNext("Hello")
    emitter.onComplete()
    emitter.onNext("World")
}
source2.subscribe(System.out::println)

// Hello

val source3: Observable<String> = Observable.create { emitter ->
    emitter.onNext("Hello")
    emitter.onError(Throwable())
    emitter.onNext("World")
}
source3.subscribe(System.out::println, {
    throwable -> System.out.println("Error!")
})

// Hello
// Error!

just() 연산자

just() 연산자는 인자로 넣은 아이템을 그대로 발행하는 Observable 생성할 수 있다. 인자에는 한 개이상의 아이템을 넣을 수 있다. 하지만  RxJava에서 기본적으로 null을 허용하지 않기 때문에 just 인자에 null을 넣으면 안 된다. 만약 아무 아이템도 발행하지 않으려면 empty() 연산자를 사용하여 빈 Observable을 생성할 수 있다.

val source4 = Observable.just("Hello", "World")
source4.subscribe(System.out::println)

// Hello
// World

참고 : 옥수환 지음[아키텍처를 알아야 앱 개발이 보인다]