개발/안드로이드
Single, Maybe, Completable
kwony
2021. 7. 4. 17:59
RxJava2 들어오면서 Single, Maybe, Completable Observable이 추가됐다. 개발 할 때는 Single만 사용했었는데 이번 포스트에서 자주 쓰지 않은 Maybe, Completable에 대해서 배워보고 앞으로 용도에 맞춰서 사용해보려고 한다.
Single
단일의 데이터 보내거나 에러를 내는 Observable이다. 주로 서버로부터 http 데이터를 받아올 때 사용한다. 아래 처럼 단일 데이터 객체인 Post를 받아오는 api를 사용한다면 Single로 Observable을 받고 doOnSuccess에서 받아온 데이터를 열어 볼 수 있다. 에러인 경우에는 doOnError를 실행한다
interface RxApi {
@GET("api/v1/post")
fun getPost(@Query("postId") postId: Long): Single<Post>
}
apiClient.getPost(postId)
.doOnSuccess { post ->
Log.d("rxtest", "post: ${post.postId}")
}
.doonError { }
.subscribe()
Maybe
Single처럼 단일의 데이터를 보내는데 빈 값을 보낼 수 있다는 점이 다르다. 서버에서 데이터를 읽는데 너무 오랜 시간이 걸리는 경우나 종종 빈 값을 내려줘야 하는 경우 요긴하게 쓸 수 있다. 빈 값이 내려오는 경우에는 doOnError 가 호출된다.
Maybe.empty<Int>()
.doOnSuccess {
Log.d("rxjava test", "printed: $it")
}
.doOnError { throwable ->
Log.d("rxjava test", throwable.localizedMessage?: "")
}
.subscribe()
Completable
함수의 리턴 값은 관심 없고 완료의 유무만 확인하고 싶을 때 사용하는 Observable이다. 서버에 객체를 업데이트하는 요청을 보낸 경우나 로깅용도로 사용하는 경우가 이런 경우에 적합하다.
interface RxApi {
@POST("api/v1/log")
fun logEvent(@Body param: String): Completable
}
apiClient.logEvent("this is blog post")
.doOnComplete {
Log.d("rxjava test", "finished time: ${System.currentTimeMillis()}")
}
.subscribe()