본문 바로가기
Programming 개발은 구글로/JAVA[Android]

[RxJava] Single 개념 이해

by 40대직장인 2022. 6. 5.

Single 

1. 개념

Single은 Observable의 변형된 형태이다. Observable과 비슷하지만, 여러 개의 데이터를 발행할 수 있는 Observable과 달리 Single은 한 개의 데이터(혹은 에러)만을 발행한다.

 

Observable은 3가지 알림을 보내는 반면, Single은 onSuccess, onError 2가지의 알림을 보낸다.

  • onSuccess : 데이터 하나를 발행함과 동시에 종료
  • onError : 에러가 발생했음을 알림

 

RxJava (and its derivatives like RxGroovy & RxScala) has developed an Observable variant called “Single.”

A Single is something like an Observable, but instead of emitting a series of values — anywhere from none at all to an infinite number — it always either emits one value or an error notification.

For this reason, instead of subscribing to a Single with the three methods you use to respond to notifications from an Observable (onNext, onError, and onCompleted), you only use two methods to subscribe:
onSuccess
  a Single passes this method the sole item that the Single emits
onError
  a Single passes this method the Throwable that caused the Single to be unable to emit an item

A Single will call only one of these methods, and will only call it once. Upon calling either method, the Single terminates and the subscription to it ends.

 

 

Marble Diagram을 보면 Single은 데이터 하나를 발행함과 동시에 종료한다.

 

데이터 발행(onNext)과 완료(onCompleted)를 각각 알렸던 Observable과 달리 Single은 데이터 발행의 완료를 따로 알리지 않는다는 것이 특징이다.

 

따라서 Single은 결과를 단일 값으로 가져오는 네트워크 통신 등에 유용하게 사용할 수 있다.

 

2. 예제

간단하게 Single을 생성하는 예제를 만들어보겠다.

가장 간단한 생성 방법은 정적 팩토리 함수(생성 연산자) just를 사용하는 것이다.

 

Observable의 just를 사용할 때와 같은 방법으로 사용하면 된다.

 

Single.just(1) // Single.just()
      .subscribe(System.out::println);

 

또 다른 생성 연산자인 create를 사용할 수도 있다.

 

Single<Integer> createdSingle = Single.create(new SingleOnSubscribe<Integer>() { Single.create() 사용
    @Override
    public void subscribe(@NonNull SingleEmitter<Integer> emitter) throws Throwable {
        emitter.onSuccess(1);
    }
});
createdSingle.subscribe(System.out::println);

 

SingleEmitter <T>를 이용해 데이터를 발행하거나(onSuccess), 에러를 발생시킬 수 있다(onError).

 

Observable을 Single로 변환할 수도 있다.

단, 여러 데이터를 발행하는 Observable을 Single로 변환하면 컴파일 에러가 발생한다는 사실에 주의하자.

 

Observable<Integer> observable = Observable.just(1);
Single.fromObservable(observable) // fromObservable() 사용
        .subscribe(System.out::println);

Observable.just(1)
        .single(0) // default-  value single() 사용
        .subscribe(System.out::println);

 


출처: Single

https://reactivex.io/documentation/single.html

 

 

댓글