정상에서 IT를 외치다

[리엑티브 연습] Observable, Single, Maybe, Completable 본문

안드로이드

[리엑티브 연습] Observable, Single, Maybe, Completable

Black-Jin 2019. 6. 25. 15:44
반응형

안녕하세요. 블랙진입니다.

리엑티브 연습 포스팅 입니다.



Observable

public abstract class Observable<T> implements ObservableSource<T> 

Observable은 ObservableSource를 구현하고 있습니다. Observable을 생성할 때는 인스턴스를 직접 만들지 않고 정적 팩토리 함수를 호출합니다. 그렇게 기본 적인 just()에서 부터 정말 다양한 팩토리 함수를 가지고 있습니다. 


Observable은 세 가지 상태를 구독자에게 전달합니다.


onNext 

데이터 발행을 알려줍니다.


onComplete 

1. 모든 데이터가 발행되었음을 알려줍니다. 

2. onComplete 이후에는 onNext는 발생하지 않습니다. 

3. dispoes()는 Observable에게 데이터를 더 이상 발행하지 않도록 구독을 해지하는 함수인데 onComplete 콜백이 되면 자동으로 dispose 됩니다.


onError

1. 에러 이벤트로 발생 이후에는 onNext 및 onComplete 이벤트가 발생하지 않습니다. 

2. onError 또한 콜백이 되면 자동으로 dispose 됩니다.

val observable = Observable.create<Int> {
it.onNext(1)
it.onNext(2)
it.onError(error("BlackJinTest error"))
}

val disposable = observable.subscribe {
println(it)
}

println("${disposable.isDisposed}") // error 발생 후 true 리턴

3. onError() 이후 로그를 찍어 본 결과 isDisposed 는 true 가 나왔습니다.




Single

public abstract class Single<T> implements SingleSource<T>

Single은 SingleSource를 구현하고 있습니다. Observable과 동일하게 동작되며 비슷한 함수를 가지고 있습니다. 오직 1개의 데이터만 발행합니다.


Single은 두 가지 상태를 구독자에게 전달합니다.


onSuccess

Observable의 onComplete와 동일


onError

Observable의 onError와 동일


활용 예


데이터가 발행과 동시에 onSuccess로 종료 됩니다. 데이터 1개만을 발행하기 때문에 바로 종료가 되어야겠죠?


주로 한 번의 데이터만 발행하는 API 통신에 많이 사용합니다.

@FormUrlEncoded
@POST("/blackjin/test/temp")
fun postTemp(@Field("temp1") temp1: String,
@Field("temp2") temp2: String): Single<Data>




MayBe

public abstract class Maybe<T> implements MaybeSource<T> {

Maybe는 MaybeSource를 구현하고 있습니다. Observable과 동일하게 동작되며 비슷한 함수를 가지고 있습니다. Single 처럼 하나의 데이터를 가질 수 있지만 데이터 발행 없이 완료할 수도 있습니다.


Maybe은 세 가지 상태를 구독자에게 전달합니다.


onSuccess

값이 있는 경우

Maybe.just("Maybe")
.subscribe(::println, // onSuccess
{ println(it) }, // onError
{ println("onComplete") }) // onComplete


onComplete

값이 없는 경우

Maybe.fromCallable { null }
.subscribe(::println, // onSuccess
{ println(it) }, // onError
{ println("onComplete") }) // onComplete


onError

에러가 발생한 경우


활용 예


Maybe는 언제 사용하면 좋을까요?




Completable

public abstract class Completable implements CompletableSource

Completable는 CompletableSource를 구현하고 있습니다. 역시 Observable의 발전된 모습이며 Maybe 에서 값이 없는 경우 처럼 리턴되는 값이 없습니다.


Conpletable은 두 가지 상태를 구독자에게 전달합니다.


onComplete

리턴 되는 값이 없습니다.


onError

에러가 발생한 경우


활용 예


Room 데이터 베이스 사용에서와 같이 백그라운드에서 동작해야 되는 함수가 필요한 경우 쓸 수 있습니다.

fun runOnIoScheduler(func: () -> Unit): Disposable = Completable
.fromCallable(func)
.subscribeOn(Schedulers.io())
.subscribe()

사용 코드

//room 데이터 업데이트
runOnIoScheduler { todoDao.update(todo) }

//room 데이터 삭제
runOnIoScheduler { todoDao.delete(todo) }


반응형
Comments