본문 바로가기

IT/Android

[Android] RxJava를 이용한 EventBus

회사 서비스를 제작하던 중, 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