Android 개발/Retrofit, RxJava, RxAndroid, OKHttp

RxJava로 구현하는 EventBus

Developer88 2017. 9. 28. 00:01
반응형

Event를 하나의 클래스에서 받아서 중개해주는 방식의 EventBus방식은,

바로 연결되어 있지 않아서 Listener를 전달하기 힘들 Activity나 Fragment, Service들 사이에 Event를 전달하기 참 좋은데요.

EventBus나 지금은 Deprecated된 Square사의 Otto도 있지만, RxJava로도 구현할 수 있습니다.

(Otto가 Deprecated된 이유도 RxJava때문이지요.)


오늘은 이 방법에 대해서 정리해 보겠습니다. 



1. 구현 방법


우선 간단하게 구현방법을 정리해 보겠습니다.

먼저, Event의 중개자가 될 Singleton방식의 EventBus클래스를 생성하구요.

이 EventBus를 이용해, EventSend와 EventGet을 할 수 있는 메소드를 만들어 줍니다.


위와 같이 구현하려면,

한가지 알아야 할 RxJava의 Api가 있는데요.

바로, PublishSubject 입니다.


이것을 먼저 알아보고 실제 코드로 구현하면서 정리해 보겠습니다.



2. PublishSubject

 

우선, PublishSubject에서 Subject가 무엇인지 가볍게 보고 가겠습니다.

소스코드에 적혀있는 설명을 보면 다음과 같은데요.




소스코드의 주석에는, Observable이면서 동시에, Observer인 Object를 Subject라고 하는데요.


공식페이지의 설명을 보면, Observer이면서 Observable이 될 수 있으므로, 

하나의 bridge 나 proxy로서 동작할 수 있다고 합니다.


좀 더 풀어서 생각해 보면,

이벤트에 Observer로서 Subscribe 해서 데이터 스트림을 받고,

받은 데이터 스트림을 다시, Observable로서 방출해 줄 수 있는 중개자가 될 수 있다는 것이지요.

EventBus를 만들기에 최적의 클래스이네요.


PublishSubject는 위와같은 성질의 Subject중 하나로,

Observer가 subscribe해서 이벤트를 듣기시작하면, 그 시점으로부터 발생한 아이템들을(데이터들을) 흘려보내주는 클래스입니다.


소스코드를 보면 다음과 같은데요.

당연히도, Subject클래스를 상속합니다. 




onCompleted, onError, onNext 메소드들을 가지고 있네요.




http://reactivex.io/RxJava/javadoc/rx/subjects/PublishSubject.html 에 나와있는 다이어그램도 보겠습니다.




PublishSubject에 대해서, 알아보았구요. 

아래에서 실제로 EventBus를 구현해 보겠습니다.



3. EventBusClass 구현


먼저 객체 생성시에, PubishSubject클래스의 create메소드를 이용해서, 

PublisSubjcect객체를 생성하는,

Singleton방식의 RxEventBus 클래스를 생성하겠습니다.




이제 이 클래스는 중개자이므로,

Event를 받고, 다시 Send할 수 있도록 메소드도 추가하겠습니다.


어떤 형태도 보낼 수 있도록 object형태로 인자를 받아내고, 보냈지만,

String만 보낸다면, String으로 인자를 잡을 수도 있습니다.




3. Event Sender


위에서 중개자를 구현하였으니,

이번에는 Event를 보내보도록 하겠습니다.


사용자가 버튼을 누르면, 액티비티를 하나 실행시키고, 

Event를 보내도록 하겠습니다.



3. Event Getter 구현


이제 Event의 생성자, 중개자가 생겻으니,

이 Event를 받아 보겠습니다.


MainActivity의 OnCreate()에서 아래와 같이 받았습니다.

여기서는 이벤트를 받았을 때,

sender가 보내준 String만 간단하게 토스트메시지만 띄우도록 하겠습니다.




위와같이 구현하면 이벤트를 받아서, 

testEvent라는 토스트메시지를 볼 수 있습니다.

이를 응용하면, 로컬의 데이터베이스가 수정된 경우 Event를 전파해서 바로바로 반영하도록 하는일이 가능해 지겠네요.


728x90