Single

RxJava(그리고 RxGroovy나 RxScala 같은 reactivex의 구현체들)는 Observable과 유사한 “Single”을 제공한다.

Single은 Obvservable의 한 형태이지만, Observable처럼 존재하지 않는 곳에서부터 무한대까지의 임이의 연속된 값들을 배출하는 것과는 달리, 항상 한 가지 값 또는 오류 알림 둘 중 하나만 배출한다.

이런 이유 때문에, Single을 구독할 때는 Observable을 구독할 때 사용하는 세 개의 메서드(onNext, onError, 그리고 onCompleted) 대신 다음의 두 메서드만 사용할 수 있다:

onSuccess
Single은 자신이 배출하는 하나의 값을 이 메서드를 통해 전달한다
onError
Single은 항목을 배출할 수 없을 때 이 메서드를 통해 Throwable 객체를 전달한다

Single은 이 메서드 중 하나만 그리고, 한 번만 호출한다. 메서드가 호출되면 Single의 생명주기는 끝나고 구독도 종료된다.

Single 연산자를 통한 구성

Observable과 마찬가지로, Single도 다양한 연산자들을 제공한다. 이 중 어떤 연산자들은 Observable과 Single을 섞어서 사용할 수 있도록 Observable의 영역과 Single의 영역을 연결하는 인터페이스 역할을 수행한다:

연산자리턴 타입설명
composeSingle이 연산자를 통해 사용자 정의 연산자를 만들 수 있다
concat 그리고 concatWithObservable여러 개의 Single이 배출한 항목들을 Observable이 배출하는 형태로 변환한다
createSingle명시적으로 subscriber 메서드 호출을 통해 Single을 생성한다
delaySingleSingle의 항목 배출을 명시된 시간 만큼 미룬다
doOnErrorSingleonError 메서드가 호출될 때 전달한 메서드를 실행하는 Single을 리턴한다
doOnSuccessSingleonSuccess 메서드가 호출될 때 전달한 메서드를 실행하는 Single을 리턴한다
errorSingle오류를 구독하는 구독자에게 즉시 오류가 발생했음을 알리는 Single을 리턴한다
flatMapSingleSingle이 배출하는 항목에 적용된 함수의 결과를 담은 Single을 리턴한다
flatMapObservableObservableSingle이 배출한 항목에 적용된 함수의 결과를 담은 Observable을 리턴한다
fromSingle퓨처를 Single로 변환한다
justSingle명시한 항목을 배출하는 Single을 리턴한다
mapSingle소스 Single이 배출한 항목에 적용된 함수의 결과를 배출하는 Single을 리턴한다
mergeSingle두 번째 Single을 배출하는 Single을 전달 받은 후, 두 번째 Single이 배출한 항목을 배출하는 Single을 리턴한다
merge 그리고 mergeWithObservable여러 Single이 배출한 항목들을 머지 후 Observable을 리턴하며 리턴된 Observable은 머지된 Single들의 항목들을 배출한다
observeOnSingle특정 스케줄러 상에서 구독자 메서드를 호출하는 Single을 리턴한다
onErrorReturnSingle명시된 항목을 배출하는 Single을 오류 알림을 보내는 Single로 변환한다
subscribeOnSingle특정 스케줄러 상에서 동작하는 Single을 리턴한다
timeoutSingle특정 시간 동안 소스 Single이 항목을 배출하지 못하면 오류 알림을 보내는 Single을 리턴한다
toSingleSingle항목 하나를 배출하는 Observable을 Single로 변환한다
toObservableObservableSingle을 Observable로 변환하며 변환된 Observable은 Single이 배출 할 항목을 배출한 후 종료된다
zip 그리고 zipWithSingle두 개 이상의 Single들이 배출한 항목에 적용된 함수의 결과를 담은 항목을 하나 배출하는 Single을 리턴한다

지금부터는 마블 다이어그램을 통해 이 연산자들에 대해 설명한다. 이 다이어그램은 마블 다이어그램을 통해 어떻게 Single이 표현되는지 보여준다:

compose

concat 그리고 concatWith

이 연산자의 인스턴스 버전도 존재한다:

create

delay

다른 버전의 연산자로 특정 스케줄러 상에서 Single의 배출을 지연시킨다:

doOnError

doOnSuccess

error

flatMap

flatMapObservable

from

스케줄러를 파라미터로 받는 다른 버전 역시 존재한다:

just

map

merge 그리고 mergeWith

한 버전은 Single을 파라미터로 전달 받는데, 이때 전달된 Single은 두 번째 Single을 배출한다. 그 후 이 연산자는 두 번째 Single이 배출한 항목을 배출하는 또 다른 Single을 리턴한다:

또 다른 버전은 두 개 이상의 Single을 전달 받고 머지한 후에 Observable을 리턴하는데 이때 리턴되는 Observable은 (임의의 순서에 따라)소스 Single이 배출한 항목들을 배출한다:

observeOn

onErrorReturn

subscribeOn

timeout

timeout 연산자는 Single이 구독된 이후 특정 시간 동안 항목이 배출되지 않으면 Single이 오류 알림을 보낸다. 특정 시간을 명시해 타임 아웃을 설정할 수 있다:

연산자에 특정 스케줄러스를 명시할 수도 있다:

timeout 연산자 중 하나는 타임 아웃이 발생하면 오류 알림을 보내는 대신 백업 싱글로 대체시키는 기능을 제공한다:

또한, 이 연산자는 스케줄러 명시적인 버전도 제공한다:

toObservable

zip zipWith