본문 바로가기
Android/RxJava

RxJava (4) - Single, Maybe, Completable

by 태크민 2023. 6. 18.

다양한 Observable의 형태

Observable 스트림 외에도 Single, Maybe, Complete처럼 특별한 스트림이 있다.

 

 

Single


개념

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

Observable은 3가지 알림(onNext(), onError(), onComplete())을 보내는 반면, Single은 onSuccess, onError 2가지의 알림으 보낼 수 있다.

한개의 데이터(혹은 에러)만 발행하기 때문에 onNext(), onComplete() 대신 onSuccess()를 사용해 데이터 발행이 완료됨을 알려준다. 오류 처리는 Observable의 Emitter와 동일하게 onError()를 이용해 구독자에게 알려준다.

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

Marble Diagram을 보면 Single은 데이터 하나를 발행함과 동시에 종료한다. 데이터 발행(onNext)과 완료(onCompleted)를 각각 알렸던 Observable과 달리 Single은 데이터 발행의 완료를 따로 알리지 않는다는 것이 특징이다.

 

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

 

예제

// 1. Single.just() 사용하는 경우
Single.just(1)
      .subscribe(System.out::println);
// 2. Single.create() 사용
Single<Integer> createdSingle = Single.create(new SingleOnSubscribe<Integer>() {
    @Override
    public void subscribe(@NonNull SingleEmitter<Integer> emitter) throws Throwable {
        emitter.onSuccess(1);
    }
});
createdSingle.subscribe(System.out::println);
[실행결과]
1

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

 

 

Maybe


개념

Maybe도 Observable의 또 다른 형태이다. Maybe는 최대 데이터 하나를 발행할 수 있으며 추가로 데이터 없이도 완료할 수도 있다. 그래서 아이템을 발행했을 때에는 onSuccess()를 호출하고, 발행하지 않을 때에는 onComplete()를 호출한다. onSuccess()이후에 다시 onComplete()를 호출할 필요는 없다.

Single에 onComplete가 추가된 형태로, 총 3가지 알림을 보낼 수 있다.

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

예제

Maybe.create(new MaybeOnSubscribe<String>() {
    @Override
    public void subscribe(@NonNull MaybeEmitter<String> emitter) throws Throwable {
        emitter.onSuccess("Maybe 1");
        emitter.onSuccess("Maybe 2");
        emitter.onComplete();
    }
}).subscribe(new Consumer<String>() {
    @Override //onSuccess
    public void accept(String s) throws Throwable {
        System.out.println("onSuccess : "+s);
    }
}, new Consumer<Throwable>() {
    @Override //onError
    public void accept(Throwable throwable) throws Throwable {

    }
}, new Action() {
    @Override //onComplete
    public void run() throws Throwable {
        System.out.println("complete");
    }
});
[실행결과]
onSuccess : Maybe 1

Maybe는 최대 데이터 하나를 발행하므로 여러 개의 데이터를 전달해도 단 하나의 데이터만 발행되고 종료됨을 볼 수 있다. 또한 onSuccess가 데이터를 발행함과 동시에 종료되므로 이후에 나온 onComplete는 실행되지 않는다.

 

 

Completeble


개념

Completable은 데이터를 발행하는 Observable, Single, Maybe와 달리 데이터 발행의 완료/에러 신호만 보내는 특수한 형태이다. 따라서 아이템 발행을 하지 않기 때문에 onNext(), onSuccess()는 쓰지 않고 데이터 완료를 알리는 onComplete()와 에러 발생을 알리는 onError()만을 사용한다.

  • onComplete : 데이터 발행이 완료됐음을 알림
  • onError : 에러가 발생했음을 알림

 

예제

Completable은 just 연산자가 없으므로 create 연산자나 fromXXX를 통해 생성한다. 예제를 보면, Completable은 데이터 없이 완료했다 / 에러가 발생했다는 결과만 전달하고 종료한다.

Completable completed = Completable.create(new CompletableOnSubscribe() {
    @Override
    public void subscribe(@NonNull CompletableEmitter emitter) throws Throwable {
        emitter.onComplete();
    }
});
completed.subscribe(new Action() {
    @Override
    public void run() throws Throwable {
        System.out.println("onComplete");
    }
}, new Consumer<Throwable>() {
    @Override
    public void accept(Throwable throwable) throws Throwable {
        System.out.println("onError");
    }
});
[실행결과]
onComplete

 

 

출처

[RxJava] RxJava 이해하기 - 3. Single, Maybe, Completable - HERSTORY (4z7l.github.io)