Java Observable 사용해보기

최근 Rx를 많이 사용하는것이 보이길래 개인적으로 학습을 진행했다. 우리 회사 특성 상 SDK 배포시 dependencies 추가를 지양하고 있기 때문에 개인 프로젝트나 데모 작성시 사용할 예정이다.

튜토리얼을 통해 학습하면서 Observable을 간단하게 정리했다.

Observable

데이터의 강을 만들어 전달

Observe

데이터 처리


예제 소스

처리 실행 결과 전달
Observable<String> myObservable = Observable.create(
    new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("Hello");
            subscriber.onNext("world!");
            subscriber.onCompleted();
        }
    }
);
수신
Observer<String> myObserver = new Observer<String>() {
    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
    }

    @Override
    public void onNext(String s) {
        System.out.println(s);
    }
};
subscribe 등록
myObservable.subscribe(myObserver);
출력 결과
"Hello"

"World"

간결하게 작성

Observable<String> myObservable = Observable.from(new String[]{"Hello", "world!"});
myObservable.subscribe(new Action1<String>() {
    @Override
    public void call(String s) {
        System.out.println(s);
    }
});

데이터를 제공하는 생산자로 세가지 유형의 행동을 한다.

  1. onNext - 새로운 데이터를 전달한다.
  2. onCompleted - 스트림의 종료
  3. onError - 에러 신호를 전달한다.

Subscribe는 옵저버블이 만드는 스트림에 응대하여 처리할 수 있게 대칭적으로 인터페이스가 구성되어 있습니다.

simpleObservable
    .subscribe(new Subscriber<String>() {
        @Override
        public void onCompleted() {
            Log.d(TAG, "complete!");
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "error: " + e.getMessage());
        }

        @Override
        public void onNext(String text) {
            ((TextView) findViewById(R.id.textView)).setText(text);
        }
    });

편의를 위해

onNext만 다루는것
onNext, onError를 다루는 것
onNext, onError, onCompleted를 모두 다루는 구성이 있습니다.

simpleObservable
    .subscribe(new Action1<String>() {
        @Override
        public void call(String text) {
            ((TextView) findViewById(R.id.textView)).setText(text);
        }
    });
simpleObservable
    .subscribe(new Action1<String>() {
        @Override
        public void call(String text) {
            ((TextView) findViewById(R.id.textView)).setText(text);
        }
    }, new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {

        }
    });
simpleObservable
    .subscribe(new Action1<String>() {
        @Override
        public void call(String text) {
            ((TextView) findViewById(R.id.textView)).setText(text);
        }
    }, new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {

        }
    }, new Action0() {
        @Override
        public void call() {

        }
    });