RxAndroid는 Retrofit을 사용해보려고 하던차에

이와 궁합이 아주 좋으면서 AsyncTask를 대체할 라이브러리가 있다고 들어서

접하게 되었는데요.

조금씩 써보니 장점이 많은것 같아서 정리해보고자 합니다.



1. 라이브러리 설정


역시나 외부 라이브러리를 불러오는 것이니, Dependency 설정부터 합니다.

참고로, Gradle파일을 직접 수정하시는 분들은 

가장 하단에 compile 'io.reactivex:rxjandroid:1.2.1' 만 추가하면 됩니다. 

하지만, 요즘엔 이렇게 잘 않하시지요? ;)


2. RXANDROID의 4대 요소 


RxAndroid는 크게 4가지로 구성되어 있는데요.

  • Observable

  • Observer

  • Scheduler

  • SubScription

이렇게 4가지 입니다.


2-1. Observable


먼저 Observable은 끊임없이 흘러나오는 데이터의 스트림을 가르킵니다. 

(데이터의 강물이라고도 부르네요)

Observable은 아이템들이나  그 아이템의 배열들을 방출하는데요.

바로 위의 코드에서는 BodyText라고 하는 String하나만을 방출합니다.


옵저버블은 onNext, OnComplete, onError를 통해 데이터전달 뿐 아니라 에러신호도 전달하는 역할도 하는데요. 우선 지금 단계에서는 just라고 하는 하나의 데이터만 전달하는 것에 집중해보고

차후에 3가지 전달케이스에 대해서도 알아보도록 하겠습니다.

우선은 데이터를 방출하는 것이 옵저버블이고, just(단지)를 통해 하나의 데이터만 방출했구나 하고

이해합니다.



2-2. Observer


방출을 하였으니, 이제 받아야 겠습니다~.


Observable에서 흘러나온 데이터를

Observer가 Subscribe(구독)해서 반응합니다.

위의 코드에선 fetchObserver()라는 커스텀 메소드를 사용하여 반응하였습니다.


Observer라고 거창한 이름이지만, 결국엔

Observable이 보낸 데이터를 받는 간단한 일이네요.


스타크래프트의 그 옵저버를 생각해도 될까요? ㅎㅎㅎ

어쨌던 보낸 데이터를 관찰해서 받아내는 녀석이라고 생각해도 될것 같습니다.


참고로 fetchObserver()라는 것은 그저bodyText라는 스트링 데이터를 어떻게 가공해서 쓸지에 대해서 기술하는 것인데, TextView에 setText하는 정도로 처리해도 되겠네요.



2-3. Subscription


Observable이 방출한 아이템들을 Observer가 구독해서 반응을 하는데요.

바로 이때, Observer와 Observable의 연결을 Subscription이라고 합니다.


그러니까, 아이템을 보내는 것이 있고, 받는 것이 있는데, 보내는 것과 받는 것의 연결자체를

Subscription이라고 합니다.


이 Subscription이라는 것이 굉장히 중요하게 사용될 수 있는데요.

안드로이드의 각각의 생명주기에서도, 언제든지 이 Subscription을 가져와서 Unregister할 수 있습니다.



2-4. Scheduler  

왠 스케쥴러냐 하실수 있겠지만, 

이건 멀티쓰레드를 적용하고자 할때 사용한다고 생각하시면 됩니다.



SubscribeOn은 메인쓰레드가 아닌, 워커쓰레드를 지정한다는 것이구요,
ObserveOn은 Observable에서 보낸 데이터를 Observer가 받아서 subscribe를 할때, 즉 다시말하면 데이터를 가공해서 써먹을때 어디다 그결과를 보낼것이냐는 것입니다.

인터넷을 통해서 자료를 받아와서 보여주는 네트워킹은 워커쓰레드에서 해야할 것이고, 그 결과를 보여주는 것은 UI를 보여줄 수 있는 메인쓰레드에서 해야할텐데요. observeOn(AndroidSchedulers.mainThread())라는 것은 메인쓰레드에서 그 가공한 데이터를 보여줘라 라는 것입니다.


3. 4대요소 종합
위에서 정리해본 4대요소를 정리해서 볼 수 있는 코드입니다.


위에서 나오지 않은 것은 map()과 subscribe시의 onNext, onCompleted, onError인데요.

먼저, map()은 Observable이 배출하는 아이템에 함수를 적용해서 변환시키는 연산자입니다.
이러한 메소드들은 매우 많이 존재하는데요, 
차후에 두번째 블로그를 통해서 더욱 구체적으로 알아보도록 하겠습니다. 
여기서는 filename을 받아와서 새로운 캐쉬 파일을 생성하는 연산을 하였네요.

옵저버가 반응을 하는 3가지 메소드인 onNext, onCompleted, onError은
onNext = observable이 새 아이템들을 방출할때마다 호출되는 메소드이구요
onError = 익셉션이 생겼을때 호출되는 메소드입니다.
onCompleted = 오류가 발생하지 않고 마지막 onNext가 호출되고 나서 최종적으로 호출되는 것입니다. 여러개의 파일이 다 다운로드되고 최종적으로 호출해서 다운로드가 끝났다고 알려주는 케이스를 생각해보면 될것 같아요.

정리해보면, 위 코드는 데이터의 스트림인 
Observable에서 filename을 받아와서,
map()를 이용해 캐쉬파일을 생성하는 연산을 했는데,
이 때, 이 작업은 (subscribeOn은) 워커쓰레드를 이용하였구요, 
데이터를 받아와서 메인쓰레드에서 표현을 할 것입니다.
subscribe해서 받은 데이터가
에러가 났다면, 로그를 찍도록 했구요,
에러가 나지 않았다면 mResultText에 텍스트를 보여주도록 한 코드입니다.



4. 정리

rxJava를 사용하면 AsyncTask는 사용하는 방법마저 잊어버리게 된다는 데요,

저도 써보니 AsyncTask는 않쓰게 되는 것 같습니다.

이제 시작이니 RxAndroid에 대해서 좀더 다양하게 공부하면서 정리해보도록 하겠습니다.

+ Recent posts