Single은 Observable의 변형된 형태입니다. Observable과 비슷하지만, 여러 개의 데이터를 발행할 수 있는 Observable과 달리 Single은 한 개의 데이터(혹은 에러)만을 발행합니다.
Observable은 3가지 알림을 보내지만 Single은 onSuccessm onError 2가지의 알림만 보냅니다.
create()를 사용할 때 Emitter를 사용하여 데이터를 발행합니다.
onSuccess : 데이터 하나를 발행함과 동시에 종료
onError : 에러가 발생했음을 알림
응답이 단 하나만 오는 특징을 있어 HTTP 통신이에 자주 사용되는데 Android에서의 HTTP 통신은 대표적으로 Retrofit2가 있습니다.
Retrofit2 빌더에는 RxJava CallAdapter를 추가하는 것을 지원하기 때문에 편리하게 HTTP 요청을 Sigle 스트림으로 만들어 사용할 수 있습니다.
fun main() {
Single.create<String> { // it: SingleEmiiter<String!>
it.onSuccess("HeeTae")
}.subscribe { it ->
println(it)
}
}
결과 : HeeTae
Observable을 Single로 변환할 수도 있습니다.
!!단 여러 데이터를 발행하는 Observable을 Single로 변환하면 컴파일에러가 발생합니다.
// fromObservable() 사용
Observable<Integer> observable = Observable.just(1);
Single.fromObservable(observable)
.subscribe(System.out::println);
// Single()사용
Observable.just(1)
.single(0) //default value
.subscribe(System.out.println);
Maybe도 Observable의 또 다른 형태입니다. Maybe는 최대 데이터 하나를 발행할 수 있으며 추가로 데이터 없이도 완료할 수 있습니다. 즉 데이터를 발행할 수도 할 수도있는 스트림입니다.
총 3가지의 알림을 보내는데
fun main() {
Maybe.create<String> { //it : MaybeEmitter<String!>
it.onSucess("HeeTae")
}.subscribe {
println(it)
}
}
결과 : HeeTae
데이터를 발행하는 Observable,Single,Maybe와 달리 데이터 발행의 완료/에러 신호만 보내는 특수한 형태입니다. 따라서 데이터 발행의 완료를 알리는 onComplete와 에러 발생을 알리는 onError 2가지 알림을 보냅니다.
fun main() {
completable.create { //it : CompletableEmiiter
println("HeeTae vlog")
it.onComplete()
}.subscribe {
println("Completable")
}
}