본문 바로가기

안드로이드

안드로이드 RxJava #2 Observable

안녕하세요

이번 시간에는 RxJava에 Observable에 대해 알아봅시다.

 

RxJava는 반응형 프로그램입니다.

반응형 프로그램이란?

주변 환경과  끊임없이 상호 작용을 하는 프로그래밍을 의미합니다.

프로그램이 주도하는 것이 아닌 환경이 변하면 이벤트를 받아 동작하도록 만드는 프로그래밍 기법을 말합니다

 

RxJava에는 Observable(식별가능한)을 subscribe(구독) 하는 Observer(관찰자)가 존재합니다.

Observable는 onNext(), onComplete(), onError() 이벤트를 사용하여 동작합니다.

 

onNext() : 하나의 소스 Observable에서 Observer까지 한 번에 하나씩 순차적으로 데이터를 발행합니다.

                 (데이터를 담는다라고 생각하면 편할 듯...)

onComplete() : 데이터 발행이 끝났음을 알리는 완료 이벤트를 Observer에 전달한다. onComplete() 이후 onNext()는 호출                          되지 않는다.

onError() : 오류가 발생했음을 Observer에 전달한다.

 

 

 

여려가지 연산자가 있지만(수백 개의 연산자를 제공한다고 한다.) 다른 분들의 블로그에서 공통적으로 많이 다룬 내용을 중심으로 글을 작성하겠습니다. 필요하다고 생각되면 이후 추가적으로 업로드하겠습니다.

 

 

 

시작하기 전에 다음과 같은 내용을 build.gradle(Module)에 추가해 줍니다.

implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.0.7'

 

 

Observable 생성하기

create() 

        Observable<String> source = Observable.create(emitter -> {
            emitter.onNext("HIHI");    		//emitter를 이용해 onNext를 사용한다.
            emitter.onNext("SeongWoo");
            emitter.onComplete();           //데이터를 모두 담으면 onComplete를 호출해야한다.
                                            //호출된이후 아이템을 추가로 발행 해도 구독자는
                                            //추가된 아이템을 받을 수 없다.

            emitter.onNext("내용추가"); 	//onComplete이후에 데이터는 추가되지 않음
        });
        source.subscribe(data-> Log.e("create", data));
//        source.subscribe(System.out::println);

실행하면 

HIHI

SeongWoo가 출력될 것입니다.

 

'내용추가' 라는 문구는 출력되지 않았습니다.

onComplete()가 호출된 이후에는 데이터를 추가적으로 받을 수 없습니다.

 

 

만약 에러가 발생하면 emitter를 통해 onError(Rhrowable)를 호출해야 합니다.

        Observable<String> source = Observable.create(emitter -> {
            emitter.onNext("HIHI");
            emitter.onError(new Throwable());
            emitter.onNext("SeongWoo");

            emitter.onNext("내용추가");
        });
        source.subscribe(System.out::println,
                throwable -> System.out.println("에러로 인해 종료되었습니다"));

HIHI가 출력되고 throwable -> System.out.println("에러로 인해 종료되었습니다") 이 부분에서 에러가 발생했다는 문구가 출력될 것입니다.

onComplete(), onError()는 동시에 호출할 수 없습니다. onError()가 호출될 때는 onComplete()를 호출하지 않아야 합니다.

 

 

 

just()

        Observable<String> source = Observable.just("Hello", "Rxjava!");
        source.subscribe(data-> Log.e("just", data));

Hello와 Rxjava! 가 출력될 것입니다.

 

just는 해당 아이템을 그대로 발생하는 Observable을 생성합니다. 타입이 같은 데이터를 여려 개를 넣을 수 있습니다.

onNext()나 onComplete()를 별도로 만들어 줄 필요는 없고 내부적으로 onNext()부터 onComplete()까지 호출을 한다고 합니다.

 

 

 

fromArray()

배열을 fromArray()를 이용해 Observable로 변환하기

        String[] item = new String[]{"A", "B", "C"};
        Observable source = Observable.fromArray(item);
        source.subscribe(System.out::println);

 

 

 

fromIterable()

Iterable을 구현한 자료 구조(ArrayList, HashSet 등)를 fromIterable()을 이용해 Observable로 변환하기

 

 	ArrayList itemList = new ArrayList<String>();
        itemList.add("A");
        itemList.add("B");
        itemList.add("C");
        Observable source = Observable.fromIterable(itemList);
        source.subscribe(System.out::println);

 

 

 

(fromFutuer() 추가 예정)

(fromPublisher() 추가 예정)

 

 

 

Single Maybe Completable

다양한 Observable의 형태이다.

 

single

하나의 아이템만 발행하는 특징이 있다.

just() 연산자를 사용하는 것이 적절하다고 한다.

	Single.just("HIHI")
                .subscribe(System.out::println);

 

create() 연산자를 사용할 때는 emitter를 사용해서 데이터를 발행한다.

onNext(), onComplete() 메서드를 호줄하는 것 대신 onSuccess()로 두 메서드를 한 번에 대체한다.

	Single.create(emitter -> emitter.onSuccess("HIHI"))
                .subscribe(System.out::println);

 

 

 

Maybe

Maybe 는 Single과 비슷하지만 아이템을 발행하거나 발행하지 않을 수 도 있다는 점에서 차이가 있습니다.

아이템을 발행할 때는 onSuccess()를 이용하고 발행하지 않을 때는 onComplete()를 호출하면 됩니다.

Maybe.create(emitter -> {
            emitter.onSuccess("HIHI");
            emitter.onComplete();
        })
                .doOnSuccess(item -> System.out.println("onSuccess 실행"))
                .doOnComplete(() -> System.out.println("onComplete 실행"))
                .subscribe(System.out::println);

그냥 바로 실행하면 onSuccess 실행 과 HIHI가 출력될 것입니다.

두 번째 줄 emitter.onSuccess("HIHI")를 주석처리하고 실행하면 "onComplete 실행" 이 출력됩니다.

아이템이 발생되면 emitter.onComplete() 이 부분은 무시가 되는 것을 알 수 있습니다.

 

 

 

Completable

Completable은 아이템을 발행하지 않고 단지 정상적으로 실행이 종료되었는지에 대해 관심을 갖는다.

onNext(), onSuccess() 같은 메서드는 없고 onError(), onComplete()만 존재한다.

	Completable.create(emitter -> {
            System.out.println("아무거나 실행할 문장");
            emitter.onComplete();
        }).subscribe(() -> System.out.println("onComplete 실행"));

 

 

 

다음 시간에는 Cold Observable과 Hot Observable에 대한 글을 작성하겠습니다

수고하셨습니다!

 

 

 

 

 

반응형