[android] RxJava가 뭐야? 맛보기!
https://medium.com/@LIP/rxjava-29cfb3ceb4ca#.9nadkqnzx
http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/
-
RxJava 란 Reactive Programming 을 위한 라이브러리인 Rx(Reactive Extensions)의 JVM 판이다.
Rx 라는 녀석은 C# 에서 처음 개념이 나왔다고 볼 수 있다.
Rx 란 비동기처리와 이벤트기반의 프로그램 개발을 위해 유용한 기능들을 제공하는 확장판이라고 볼 수 있다.
-
Reactive(반응적인) 코드의 기본적인 구성 요소는 Observable 들과 Subscriber 들이다.
Observable 은 아이템들을 발행(emit) 하고, Subscriber 는이 아이템들을 소비(consume)한다.
아이템들이 발행되는 방법에는 패턴이 있다.
Observable 은 어떠한 개수의 아이템이라도 발행 할 수 있고, 성공적인 완료 또는 에러에 의해 종결된다.
Observable 이 가지고 있는 각각의 Subscriber 들에 대해 onNext() 를 몇 번 호출하고 onComplete() 또는 onError() 가 뒤따른다.
표준적인 옵저버 패턴과 닮아 보이지만, 중요한 한가지가 다르다.
Observable 은 보통 누군가 명시적으로 subscribe 하기 전까지 아이템을 발행하지 않는다.
-
Observable<String> myObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext(“Hello, world!”);
sub.onCompleted();
}
}
);
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) { System.out.println(s); }
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
};
myObservable.subscribe(mySubscriber);
위의 코드들이 RxJava 를 이용하면 간단해진다. ( boiler plate 제거 )
Observable<String> myObservable = Observable.just(“Hello, world!”); // 정확히 동일한 동작은 아니다만..
Action1<String> onNextAction = new Action1<String>() { // action 은 subscriber 의 각 파트를 정의한다.
@Override
public void call(String s) {
System.out.println(s);
}
};
myObservable.subscribe(onNextAction); // onErrorAction, onCompleteAction 도 , 를 붙여 설정할 수 있다.
이 코드는 다시 chaining 으로 간단해질 수 있다.
Observable.just(“Hello, world!”)
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
이 흉칙한 코드가 Lamda 를 만나게 되면.. 더 간단해진다.
Observable.just(“Hello, world!”).subscribe(s -> System.out.println(s));
-
RxJava 를 이용하면 3rd part lib 의 Observable 을 사용하는 경우에 대해서 hooking 과 같은 기술도 가능하다.
observable.just(“Hello, world!”)
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s + “ -Dan”;
}
})
.subscribe(s -> System.out.println(s));
map 으로 전달된 함수를 통해 Hello, world! 에 -Dan 이 붙게 한 후 subscribe 에 전달이 된다.
물론 Lambda 를 이용해 아래와 같이 더 단순화될 수 있다.
Observable.just(“Hello, world!”)
.map(s -> s + “ -Dan”)
.subscribe(s -> System.out.println(s));
다음과 같이 type 을 변경해서 줄 수도 있다.
Observable.just(“Hello, world!”)
.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.hashCode();
}
})
.subscribe(i -> System.out.println(Integer.toString(i)));
간단히..
Observable.just(“Hello, world!”)
.map(s -> s.hashCode())
.subscribe(i -> System.out.println(Integer.toString(i)));
-
RxJava 를 Android 에 더 알맞게 포팅시켜 놓은 RxAndroid 란 녀석도 있다.
-
기존 코드를 RxJava 패턴으로 사용하려면 대부분 Observable.just() 와 Observable.from() 이 2개면 충분하다.
다음 글 : [android] RxAndroid 맛보기
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] library 를 dependency 에 명시할 수 있게 배포하기 (0) | 2018.03.11 |
---|---|
[android] RxAndroid 맛보기 (0) | 2018.03.10 |
[Android Studio] Crash 났을 때 Log 날아가지 않도록 하기 (0) | 2018.03.08 |
[android] 최고의 안드로이드 개발 원칙 (2) | 2018.03.07 |
[android] Resource Merging 에 대한 이야기.. (0) | 2018.03.06 |
댓글