본문 바로가기

Android/RX

4. Simple, Maybe, Completable

참고 공통 소스

dennis.tistory.com/30

 

4. 공통 소스 (참고용)

import java.time.LocalTime; import java.time.format.DateTimeFormatter; public class TimeUtil { public static long start; public static long end; final static DateTimeFormatter formatter = DateTimeFo..

dennis.tistory.com

 

Single

- 데이터를 1건만 통지하거나 에러를 통지한다.

- 데이터 통지 자체가 완료를 의미하기 때문에 완료 통지는 하지 않는다.

- 데이터를 1건만 통지하므로 데이터 개수를 요청할 필요가 없다.

- onNext( ), onComplete( )가 없으며 이 둘을 합한 onSuccess( )를 제공한다.

- Single의 대표적인 소비자는 SingleObserver이다.

- 클라이언트의 요청에 대응하는 서버의 응답이 Single을 사용하기 좋은 대표적인 예다.

import com.itvillage.utils.DateUtil;
import com.itvillage.utils.LogType;
import com.itvillage.utils.Logger;
import io.reactivex.Single;

public class Todo {
    public static void main(String[] args){
        Single<String> single = Single.create(emitter -> emitter.onSuccess(DateUtil.getNowDate()));

        single.subscribe(
                data -> Logger.log(LogType.ON_SUCCESS, "# 날짜시각: " + data),
                error -> Logger.log(LogType.ON_ERROR, error)
        );
        
        Single.just(DateUtil.getNowDate())
                .subscribe(
                        data -> Logger.log(LogType.ON_SUCCESS, "# 날짜시각: " + data),
                        error -> Logger.log(LogType.ON_ERROR, error)
                );
        
        // observable -> Single
        Observable<String> observable = Observable.just(DateUtil.getNowDate());
        Single.fromObservable(observable)
                .subscribe(
                        data -> Logger.log(LogType.ON_SUCCESS, " # 날짜시각: " + data),
                        error -> Logger.log(LogType.ON_ERROR, error)
                );
        
        
    }
}

 

 

Maybe

- 데이터를 1건만 통지하거나 1건도 통지하지 않고 완료 또는 에러를 통지한다.

- 데이터 통지 자체가 완료를 의미하기 때문에 완료 통지는 하지 않는다.

- , 데이터를 1건도 통지하지 않고 처리가 종료될 경우에는 완료 통지를 한다.

- Maybe의 대표적인 소비자는 MaybeObserver이다.

import com.itvillage.utils.DateUtil;
import com.itvillage.utils.LogType;
import com.itvillage.utils.Logger;
import io.reactivex.Maybe;

public class Todo {
    public static void main(String[] args){
        Maybe<String> maybe = Maybe.create(emitter -> {
            emitter.onSuccess(DateUtil.getNowDate());
//            emitter.onComplete();
        });

        maybe.subscribe(
                data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
                error -> Logger.log(LogType.ON_ERROR, error),
                () -> Logger.log(LogType.ON_COMPLETE)
        );
        
        
        Maybe.just(DateUtil.getNowDate())
                .subscribe(
                        data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
                        error -> Logger.log(LogType.ON_ERROR, error),
                        () -> Logger.log(LogType.ON_COMPLETE)
                );

//        Maybe.empty() // -> ON_COMPLETE 호출
//                .subscribe(
//                        data -> Logger.log(LogType.ON_SUCCESS, data),
//                        error -> Logger.log(LogType.ON_ERROR, error),
//                        () -> Logger.log(LogType.ON_COMPLETE)
//                );


		// Single -> Maybe 
		Single<String> single = Single.just(DateUtil.getNowDate());
        Maybe.fromSingle(single)
                .subscribe(
                        data -> Logger.log(LogType.ON_SUCCESS, "# 현재 날짜시각: " + data),
                        error -> Logger.log(LogType.ON_ERROR, error),
                        () -> Logger.log(LogType.ON_COMPLETE)
                );
        
        
    }
}

 

 

 

Completable

- 데이터 생산자이지만 데이터를 1건도 통지하지 않고 완료 또는 에러를 통지한다.

- 데이터 통지의 역할 대신에 Completable 내에서 특정 작업을 수행한 후, 해당 처리가 끝났음을 통지하는 역할을 한다.

- Completable의 대표적인 소비자는 CompletableObserver이다.

import com.itvillage.utils.LogType;
import com.itvillage.utils.Logger;
import com.itvillage.utils.TimeUtil;
import io.reactivex.Completable;
import io.reactivex.schedulers.Schedulers;

public class Todo {
    public static void main(String[] args){
    
        Completable completable = Completable.create(emitter -> {
            // 데이터를 발행하는것이 아니라 특정 작업을 수행한 후, 완료를 통지한다.
            int sum = 0;
            for(int i =0; i < 100; i++){
                sum += i;
            }
            Logger.log(LogType.PRINT, "# 합계: " + sum);

            emitter.onComplete();
        });

        completable.subscribeOn(Schedulers.computation())
                .subscribe(
                        () -> Logger.log(LogType.ON_COMPLETE),
                        error -> Logger.log(LogType.ON_ERROR, error)
                );

        TimeUtil.sleep(100L);
    }
}

 

'Android > RX' 카테고리의 다른 글

4. 공통 소스 (참고용)  (0) 2021.01.14
4. Observable, Flowable  (0) 2021.01.14
4. Reactive Streams  (0) 2021.01.14
4. 리액티브 프로그래밍이란 ?  (0) 2021.01.11