Android/RxJava

[차근차근 RxJava 기록 3] 다양한 형태의 Observable

c0de_h0ng 2022. 1. 21. 22:09
728x90

Single

Observable과 다르게 단 하나의 아이템만 발행한다. 따라서 just() 연산자는 하나의 인자만 가질 수 있다.

Single.just("Hello World")
        .subscribe(System.out::println)

create() 연산자를 사용 시에는 데이터를 한 번만 발행하므로 onNext()와 onComplete()을 호출하는 대신 onSuccess(T)을 호출한다. 오류 같은 경우에는 onError() 호출하는 것은 동일하다.

Single.create<String> { emitter ->
    emitter.onSuccess("Hello")
}.subscribe(System.out::println)

Observable -> Single

Observable에서 Single로 변환하는 방법으로는 all, first, toList이 있다.

val src = Observable.just(1,2,3)
val singleSrc1 = src.all { i -> i > 0 }
val singleSrc2 = src.first(-1)
val singleSrc3 = src.toList()

Single -> Observable

Single에서 Observable으로 변환하는 방법으로는 toObservable()가 있다.

val singleSrc: Single<String> = Single.just("Hello World")
val observableSrc: Observable<String> = singleSrc.toObservable()

Single은 단일 아이템을 발행한다느 점에서 Http 통신에서도 많이 사용한다.

Maybe

Single과 비슷하지만 아이템을 발행하거나 발행하지 않을 수도 있다는 점에서 차이가 있다. 아이템을 발행할 때는 onSuccess(T)를 호출하고, 발행하지 않을 때에는 onComplete(T)를 호출한다. 따라서 onSuccess(T)를 호출할 경우에는 따로 onComplete(T)를 호출할 필요가 없다.

Maybe.create<Int> { emitter ->
    emitter.onSuccess(100)
    emitter.onComplete() //무시
}
    .doOnSuccess { item ->
        System.out.println("doOnSuccess")
    }
    .doOnComplete { 
        System.out.println("doComplete")
    }
    .subscribe(System.out::println)
    
    // doOnSuccess
    // 100
Maybe.create<Int> { emitter ->
    emitter.onComplete()
}
    .doOnSuccess { item -> System.out.println("doOnSuccess") }
    .doOnComplete { System.out.println("doComplete") }
    .subscribe(System.out::println)
    
    // doComplete

Completable

아이템을 발행하지 않고 단지 정상적으로 실행이 종료되었는지에만 관심을 갖는다. 따라서 Emitter에 onNext(), onSuccess()는 존재하지 않고 onComplete(), onError()만 존재한다.

Completable.create { emitter ->
    emitter.onComplete()
}.subscribe{
    System.out.println("complete1")
}

// complete1

 

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