ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Single, Maybe, Completable
    BackEnd/RxJava 2023. 7. 2. 05:30
    반응형

    Single

    • 데이터를 1건만 통지하거나 에러를 통지합니다.
    • 데이터 통지 자체가 완료를 의미하기 때문에 완료 통지는 하지 않습니다.
    • 데이터를 1건만 통지하므로 데이터 개수를 요청할 필요가 없습니다.
    • onNext(), onComplete()가 없으며, 이 둘을 합한 onSuccess()를 제공합니다.
    • Single의 대표적인 소비자는 SingleObserver입니다.
    • 클라이언트의 요청에 대응하는 서버의 응답이 Single을 사용하기 좋은 대표적인 예입니다.
    package com.itvillage.chapter03.chapter0303;
    
    import com.itvillage.utils.DateUtil;
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import io.reactivex.Single;
    import io.reactivex.SingleEmitter;
    import io.reactivex.SingleObserver;
    import io.reactivex.SingleOnSubscribe;
    import io.reactivex.disposables.Disposable;
    
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.logging.SimpleFormatter;
    
    /**
     * Single 클래스를 사용하여 현재 날짜와 시각을 통지하는 예제
     */
    public class SingleCreateExample {
        public static void main(String[] args){
            Single<String> single = Single.create(new SingleOnSubscribe<String>() {
                @Override
                public void subscribe(SingleEmitter<String> emitter) throws Exception {
                    emitter.onSuccess(DateUtil.getNowDate());
                }
            });
    
            single.subscribe(new SingleObserver<String>() {
                @Override
                public void onSubscribe(Disposable disposable) {
                    // 아무것도 하지 않음.
                }
    
                @Override
                public void onSuccess(String data) {
                    Logger.log(LogType.ON_SUCCESS, "# 날짜시각: " + data);
                }
    
                @Override
                public void onError(Throwable error) {
                    Logger.log(LogType.ON_ERROR, error);
                }
            });
        }
    }

     

    Maybe

    • 데이터를 1건만 통지하거나 1건도 통지하지 않고 완료 또는 에러를 통지합니다.
    • 데이터 통지 자체가 완료를 의미하기 때문에 완료 통지는 하지 않습니다.
    • 단, 데이터를 1건도 통지하지 않고 처리가 종료될 경우에는 완료 통지를 합니다.
    • Maybe의 대표적인 소비자는 MaybeObserver 입니다.
    package com.itvillage.chapter03.chapter0303;
    
    import com.itvillage.utils.DateUtil;
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import io.reactivex.Maybe;
    import io.reactivex.MaybeEmitter;
    import io.reactivex.MaybeObserver;
    import io.reactivex.MaybeOnSubscribe;
    import io.reactivex.disposables.Disposable;
    
    /**
     * Maybe 클래스를 이용하여 데이터를 통지하는 예제
     */
    public class MaybeCreateExample {
        public static void main(String[] args){
            Maybe<String> maybe = Maybe.create(new MaybeOnSubscribe<String>() {
                @Override
                public void subscribe(MaybeEmitter<String> emitter) throws Exception {
    //                emitter.onSuccess(DateUtil.getNowDate());
    
                    emitter.onComplete();
                }
            });
    
            maybe.subscribe(new MaybeObserver<String>() {
                @Override
                public void onSubscribe(Disposable disposable) {
                    // 아무것도 하지 않음.
                }
    
                @Override
                public void onSuccess(String data) {
                    Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data);
                }
    
                @Override
                public void onError(Throwable error) {
                    Logger.log(LogType.ON_ERROR, error);
                }
    
                @Override
                public void onComplete() {
                    Logger.log(LogType.ON_COMPLETE);
                }
            });
        }
    }

     

    Completable

    • 데이터 생산자이지만 데이터를 1건도 통지하지 않고 완료 또는 에러를 통지합니다.
    • 데이터 통지의 역할 대신에 Completable 내에서 특정 작업을 수행한 후 해당 처리가 끝났음을 통지하는 역할을 합니다.
    • Completable의 대표적인 소비자는 CompletableObserver 입니다.
    package com.itvillage.chapter03.chapter0303;
    
    import com.itvillage.utils.LogType;
    import com.itvillage.utils.Logger;
    import com.itvillage.utils.TimeUtil;
    import io.reactivex.Completable;
    import io.reactivex.CompletableEmitter;
    import io.reactivex.CompletableObserver;
    import io.reactivex.CompletableOnSubscribe;
    import io.reactivex.disposables.Disposable;
    import io.reactivex.schedulers.Schedulers;
    
    /**
     * Completable 을 사용하여 어떤 작업을 수행한 후, 완료를 통지하는 예제
     */
    public class CompletableCreateExample {
        public static void main(String[] args) throws InterruptedException {
            Completable completable = Completable.create(new CompletableOnSubscribe() {
                @Override
                public void subscribe(CompletableEmitter emitter) throws Exception {
                    // 데이터를 통지하는것이 아니라 특정 작업을 수행한 후, 완료를 통지한다.
                    int sum = 0;
                    for(int i =0; i < 100; i++){
                        sum += i;
                    }
                    Logger.log(LogType.PRINT, "# 합계: " + sum);
    
                    emitter.onComplete();
                }
            });
    
            completable.subscribeOn(Schedulers.computation())
                    .subscribe(new CompletableObserver() {
                @Override
                public void onSubscribe(Disposable disposable) {
                    // 아무것도 하지 않음
                }
    
                @Override
                public void onComplete() {
                    Logger.log(LogType.ON_COMPLETE);
                }
    
                @Override
                public void onError(Throwable error) {
                    Logger.log(LogType.ON_ERROR, error);
                }
            });
    
            TimeUtil.sleep(100L);
        }
    }

     

    [참고 자료]

    반응형

    'BackEnd > RxJava' 카테고리의 다른 글

    필터링 연산자  (0) 2023.07.06
    Flowable/Observable 생성 연산자  (0) 2023.07.02
    Flowable과 Observable  (0) 2023.07.02
    Reactive Streams  (0) 2023.07.01
    RxJava 프로젝트 환경 구축  (0) 2023.07.01

    댓글

Designed by Tistory.