본문 바로가기
카테고리 없음

[RxJava for Android] RxAndroid Part1

by CreativeDD 2016. 8. 15.
반응형


어떻게 사용하기 시작하였나?


저는 Retrofit(Http네트워크 라이브러리)을 사용하면서 시작하였습니다.

Retrofit과의 궁합이 아주 좋으면서

(어떻게 좋은지는 차후 다른글로 정리해볼께요~)

 AsyncTask를 대체할 수 있는 라이브러리가 있다고 듣고 

사용하게 되었습니다.


http://blog.stablekernel.com/replace-asynctask-asynctaskloader-rx-observable-rxjava-android-patterns/

(번역이 않되있기는 하지만;;;  asynctask대신 RxJava를 사용하라는 글인데요, 참조해보면 좋을것 같습니다)



-----------------------------------------------------------------------------------------------------------



역시 실습은 Gradle 설정부터!!


RxAndroid도 역시 외부 라이브러리이므로,

Gradle설정부터 해야되겠죠~

(https://github.com/ReactiveX/RxJava)

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'io.reactivex:rxandroid:1.2.1'
}

가장 하단의 compile 'io.reactivex:rxjandroid:1.2.1' 만 추가해주시면 됩니다.

(제가 글을 올리는 이 시점에도 업그레이드 버전이 나올지 모르겠네요.

rxandroid로 검색해서 최신버전을 디펜던시에 올려주시면 될 것 같아요)



-----------------------------------------------------------------------------------------------------------



"우선 코드로 시작해 보겠습니다!"


Observable.just(bodyText)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(fetchObserver());

RxJava는 크게 4가지의 구성요소로 나누어 집니다.

Observable, Observer, Scheduler, SubScription 인데요

위 코드를 뜯어보면서 구분해보시죠.




1. Observable

Observable.just(bodyText)

먼저 Observable은 

끊임없이 흘러나오는 데이터의 스트림을 가리키는데요

Observable은 아이템들이나 그 아이템의 배열들을 방출합니다.

위 코드에서는 bodyText라는 스트링이 되겠네요.




2. Observer

.subscribe(fetchObserver());

위의 코드에서 중간 두줄을 빼고 들어와서 당황하셨을 수도 있겠지만,

설명의 편의성을 위해서 바로 4번째줄로 왔습니다.


고수님들은 Observer라는 단어를 보고, 벌써 감을 잡으셨겠지요?

Observable에서 흘러나온 데이터들을 Observer가

Subscribe해서, 

React 즉 반응합니다.




3. SubScription


위에서 Observable이 방출하는 아이템들을 Observer가 Subscribe즉 구독해서 반응을 한다 라고 했었는데요.

이때 Observer와 Observable의 연결을 SubScription이라고 합니다.


이  SubScription은 굉장히 중요하게 사용될 수 있는데요.

Observer가 UnSubscribe해야 한다면, 

안드로이드의 각각의 다른 생명주기에서도

언제든지 이 SubScription을 가져와서 unregister하기만 하면 됩니다.




4. Scheduler

.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

멀티쓰레드를 적용하고 싶을때 사용하는 부분입니다.

subscribeOn은 메인쓰레드가 아닌, 다른 워커쓰레드를 지정한다는 것이고, 

observeOn은 observable이 observer에게 알림을 보낼때 사용할 스케쥴러이다.


AsyncTask를 사용해보신분들에게는 

doInBackground와 subscribeOn을 대칭적으로 생각하주시면 될것 같구요,

그외에 메인쓰레드에서 실행했던 부분을 observeOn에서 실행한다고 생각하시면 될것 같습니다.



여기서 조금 더 나가보겠습니다.


먼저 코드로 보시죠

Observable.just(filname)
.map(new Func1<String, String>() {
@Override
public String call(String s) {
File file;
try {
file = File.createTempFile(filname, null, getCacheDir());
storedCacheName = file.getName();
} catch (IOException e) {
e.printStackTrace();
}
return storedCacheName;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
Log.d(TAG, e.getMessage());
}

@Override
public void onNext(String s) {
mResultText.setText(s);
}
});

filename이라는 아이템을 방출하는 Observable을


map이라는 연산자를 통해서 어떤 아이템을 변환합니다.


이 때 subscribeOn과 observeOn을 통해서 멀티쓰레드를 사용하구요,


Observer가 이 Observable에 구독(subscribe)해서 반응(React)을 합니다.



-----------------------------------------------------------------------------------------------------------



"위에서 설명한 것중,

map과 react에 대해서는 좀더 설명이 필요한데요..."




우선 map에 대해서 알아보겠습니다.


map은 Observable이 배출하는 아이템에

함수를 적용해서 이를 변환시키는 연산자 입니다.

위에서는 파일이름을 가지고,

캐쉬파일을 생성했습니다.




onNext, onCompleted, onError


옵저버가 반응을 하는 3가지 메소드입니다.

onNext = observable이 새로운 아이템들을 방출할때마다 이 메소드가 호출됩니다.

onError = 익셉션이 생겼을때 호출됩니다.

onCompleted = 오류가 발생하지 않고 마지막 onNext가 호출되고나서 최종적으로 호출되는 것.

여러개의 파일이 다운로드되고 최종적으로 호출되는 케이스를 생각하면 될것 같습니다.



-----------------------------------------------------------------------------------------------------------



More...


지금까지 설명된 개념들을 적용해서,

AsyncTask에서 하던일들을 RxJava로 변형해서 사용하실 수 있습니다.


하지만 RxJava에는 훨씬 다양한 연산자나 사용패턴들이 존재합니다.

저도 좀더 공부를 진행하면서, 

이에 대해 정리해보고, 케이스들을 정리하면서 업데이트 해보도록 하겠습니다~


728x90