BloByJames

RxJava로 EventBus, Otto를 대체해보자 본문

IT/Android

RxJava로 EventBus, Otto를 대체해보자

blobyjames 2016. 9. 24. 01:41

새로운 패러다임으로 상승세를 달리고 있는 ReactiveX(Rx)


Rx에 익숙해진다면 코드가 간결해지므로 가독성은 물론이고,

제공하는 기능이 무수히 많기 때문에, 기존 언어의 문법을 대신해서 많이 사용하게 될 것 입니다.


하지만 처음부터 익숙해지기란 어려우니, Rx로 대체할 수 있는 것들을 차츰 바꿔가는 것을 추천해드립니다.


여기서 소개할 Rx event는 RxJavaRetroLambda를 사용하여 설명해드리는 점 미리 말씀드립니다.


저도 EventBus 참 좋아하는데요,

Android event 관련 대표적 라이브러리인 EventBus, Otto 등을 RxJava로 대체할 수 있다는 점.


우선 event Class를 singleton으로 생성합니다.


여기서 주의해야 할 점은

private PublishSubject<Object> mSubject;
public Observable<Object> getObservable() {
return mSubject;
}
public void sendEvent(Object object) {
mSubject.onNext(object);
}

PublishSubject와 getObservable()의 return type인 Observable의 generic, 

마지막으로 sendEvent(Object)의 parameter.

세 개가 모두 같은 type이어야 합니다.


여기서는 최상위 Class인 Object를 사용하고 있지만,

event로 전달하고자 하는 type으로 변경해서 사용하시면 됩니다.


이제 event를 만들었으니 전달해봅시다.


event가 전달됐으니 누군가는 받아야겠죠?


subscribe()에서 순서대로 onNext(), onError(), onCompleted() 세 가지를 모두 사용했지만,

event를 subscribe 할 때 마다 모두 사용하는 것은 불편해요.


onNext()만 사용할 수도 있고, onNext()와 onError()만 사용할 수도 있는 interface가 있으니,

필요에 맞게 사용하시면 됩니다.


(TIP, onNext()만 사용하다가 error가 발생하면 app이 죽어요.

최소한 onError()까지 처리를 해줍시다.

그 밖에도 여러가지 error handling이 있지만, 이 글은 Rx를 소개하는 포스팅이 아니므로...)


이제 끝났어요.


하지만, 개발자라면 memory 관리에도 신경을 써줘야지요.


Rx를 사용하면서 주의해야 할 점이 있습니다.

subscribe가 있다면, unsubscribe 역시 필요합니다.

그렇지 않으면 memory leak이 발생할 수 있으니 주의해야합니다.


그럼 Rx memory를 관리해주는 library를 하나 소개해드릴게요.


trello에서 개발 한 RxLifeCycle입니다.

이름에서부터 뭔가 느껴지지 않나요?


맞습니다.

Activity, Fragment, DialogFragment의 life cycle에서 unsubscribe를 대신 해 줄 친구입니다.


사용법 또한 아주 간단합니다.

그럼, RxLifeCycle 예시 코드를 보여드리고 마치겠습니다.



위에서 event를 전달받는 code와 무엇이 달라졌는지 보이시나요?

바로 RxActivity를 상속받고 있습니다.


그리고 Observable에 compose()라는 method가 하나 추가되었는데요,


bindToLifeCycle()은 기본적으로 subscribe 한 life cycle에 따라서,


onCreate()는 onDestroy(),

onStart()는 onStop(),

onResume()는 onPause(),

onStop()은 onDestroy()


에서 unsubscribe를 하게 됩니다.


제공하는 component는 아래와 같습니다.


RxActivity

RxFragment

RxDialogFragment


그리고, support library


RxAppCompatActivity

RxFragmentActivity

RxFragment

RxDialogFragment

RxAppCompatDialogFragment


이렇게 준비되어있으니, 각 component를 상속받아서 사용하시면 됩니다.


물론, 이 밖에도 다양한 지원이 있으므로, 문서를 읽어보시기 바랍니다.


감사합니다.


Comments