회사 서비스를 제작하던 중, Broadcast나 interface로 처리하기 곤란한 부분들이 존재하였다.
그래서 EventBus를 사용할려고 하였으나, 기존 프로젝트에 RxJava를 이용하고 있었기에 RxJava를 이용하여 EventBus를 만들어 사용하기로 하였다.
Rx의 Subscription을 잘 이용하면 될거라고 생각하고 작성하였다.
장점은 BroadCast로 전달할 수 없는 객체를 전달할 수 있으며, interface를 여러개 만들어 전달에 전달을 하지 않아도 된다는 점이다. 또한 Lifecycle만 잘 지키면 메모리 관리 측면에서 이득을 볼 수 있는 부분이 있다.
RxEventBus.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | import rx.Observable; import rx.subjects.PublishSubject; import rx.subjects.SerializedSubject; import rx.subjects.Subject; public class RxEventBus { private final Subject<Object, Object> bus = new SerializedSubject<>(PublishSubject.create()); public void post(Object o) { bus.onNext(o); } public Observable<Object> getBusObservable() { return bus; } } | cs |
EventBus.java
1 2 3 4 5 6 7 8 9 10 | public class EvnetBus extends RxEventBus { private static EvnetBus instance; public static EvnetBus get() { if (instance == null) instance = new EvnetBus(); return instance; } } | cs |
Data.java
-> RxEventBus를 통해 전달할 객체이다. 얼마든지 Customize해서 써도 상관없다.
1 2 3 4 5 6 7 8 9 10 11 12 | Data.java public class Data { private String mTag; public Data(String tag) { this.mTag = tag; } public String getTag() { return this.mTag; } } | cs |
실제 코드에서 사용시 Activity 또는 Fragment의 LifeCycle에 있는 onResume()과 onDestroy()에서 구독처리와 구독해지 처리를 해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @Override protected void onResume() { EvnetBus.get().getBusObservable() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(mSubscriber); super.onResume(); } @Override protected void onDestroy() { mSubscriber.unsubscribe(); super.onDestroy(); } | cs |
Subscriber에 대한 정의는 이렇게 처리 해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private Subscriber<? super Object> mSubscriber = new Subscriber<Object>() { @Override public void onCompleted() { // 완전히 완료시 처리 } @Override public void onError(Throwable e) { // 에러시 처리 } @Override public void onNext(Object o) { if (o instance Data) { Data data = (Data) o; // DATA 가공하여 사용 } ) } }; | cs |
EventBus나 Otto를 가져다 쓰는 것도 좋겠지만, 프로젝트에 라이브러리가 많아질수록 관리나 여러가지 측면에서 손해를 보는 기분도 있잖아 없다.... (극히 주관적인 생각이다....)
Rxjava를 이용한 EventBus 내용을 찾다보니 참조하게 된 내용이다. 이를 통해 좀더 간단하게 쓸 수 있는 방법을 생각해보았다. 정작 만들어 놓고 쓰다보니 개선사항이 많아 추가적으로 수정 중이다. Object 전달과 같은 부분에 있어서 instanceof와 if-else문(switch문)으로 처리하보니 소스코드가 더러워진다는 생각이 많이 들었다. 그래서 애초에 Event를 전달하는 가장 기본 베이스의 객체를 정의하고 사용할려고 수정하고 있다.
참조 : https://medium.com/mobiwise-blog/use-rxjava-instead-of-event-bus-libraries-aa78b5023097#.dy36i7n02
'IT > Android' 카테고리의 다른 글
[Android] Soft Key 기종의 소프트 키보드 관련 문제 해결 방법 (0) | 2016.07.02 |
---|---|
[Android] Retrofit 2.0 Multipart Post 전송 (0) | 2016.07.02 |
[Android] 안드로이드 개발에 유용한 라이브러리 정리 (0) | 2016.07.02 |
[Android] Glide의 SimpleTarget 관련 처리 (0) | 2016.07.01 |
[Android] Google Analytics 쉽게 적용하기 (0) | 2016.07.01 |