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);
}
});
데이터를 제공하는 생산자로 세가지 유형의 행동을 한다.
- onNext - 새로운 데이터를 전달한다.
- onCompleted - 스트림의 종료
- 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() {
}
});