안드로이드 Greenbot의 이벤트 버스 활용하기
회사에 입사해서 안드로이드 개발자 커리어를 시작한지 6개월이 되어간다.
코틀린도 모르던 나였다.
처음에는 너무 두렵고 무서워서 앞이 안 보였지만 하나씩 하나씩 배워나가다보니 이제는 업무를 하는데 있어서 조금의 여유가 생겼다.
전임자 분이 5년차 안드로이드 개발자였는데 그 분의 코드를 보면서 여러가지 공부가 되었다.
오늘 소개할 greenbot의 이벤트 버스도 전임자의 코드를 보면서 처음 알게되었다.
이벤트 버스는 간단하게 소개하면 하나의 이벤트를 여러 곳에서 구독할 수 있게 해주는 기능이다.
이해가 안되어도 상관없다.
개발자는 직접 코드를 보면서 이해하는게 빠르니까!!
1. app수준의 그래들파일에 dependencies 를 추가해준다.
dependencies {
//EventBus
implementation 'org.greenrobot:eventbus:3.2.0'
}
2. 이벤트 객체를 만들어준다.
class DialogEvent(val isBleConnected: Boolean) {
}
이벤트 객체라는 말이 처음에는 어려울 수 있다.
이럴 때는 그냥 "내가 전달하고 싶은 값"이라고 생각하면 좋다.
에를들어 bundle 객체를 만드는 것과 같은 과정이라고 생각하면 이해하기 쉬울 것 같다.
3. 위에서 만든 이벤트 객체를 post 해준다.
public void subscribeConnection(RxBleDevice device){
bleDevice = device;
Disposable connectionDisposable = device.observeConnectionStateChanges()
.distinctUntilChanged()
.subscribe(rxBleConnectionState -> {
Log.d(TAG, "subscribeConnection, connectionState: " + rxBleConnectionState);
if(rxBleConnectionState == RxBleConnection.RxBleConnectionState.CONNECTED){
isConnected = true;
connectionSource.onNext(true);
//여기 아래 코드만 보세요!!
EventBus.getDefault().post(new DialogEvent(isConnected));
Log.d(TAG, "EventBus post dialog event "); //
} else if(rxBleConnectionState == RxBleConnection.RxBleConnectionState.DISCONNECTED ||
rxBleConnectionState == RxBleConnection.RxBleConnectionState.DISCONNECTING){
Log.d(TAG, "subscribeConnection: connectionState: " + rxBleConnectionState);
isConnected = false;
connectionSource.onNext(false);
//여기 아래 코드만 보세요
EventBus.getDefault().post(new DialogEvent(isConnected));
Log.d(TAG, "EventBus post dialog event "); //
}
}, error -> Log.e(TAG, "subscribeConnection: ", error)
);
connectDisposable.add(connectionDisposable);
}
나 같은 경우에는 ble연결 이후 연결 성공, 실패 유무를 액티비티에 전달하고자 사용했다.
이벤트를 post할 때는
EventBus.getDefault().post("내가 사용할 이벤트 객체")
를 해주면된다.
(회사에서 건드린 프로젝트가 자바랑 코틀린이 혼합되어있다. 양해 부탁드린다.)👋
4. 이벤트 버스 구독하기
public class BaseActivity extends AppCompatActivity {
@Subscribe(threadMode = ThreadMode.MAIN)
public void onDialogEvent(DialogEvent event){
AlertUtils.toastShort(this, "BLE Connected : " + event.isBleConnected());
}
}
이벤트버스로 이벤트를 post했을 때 받을 곳에서 이벤트버스를 등록해주어야한다.
브로드캐스트 리시버를 등록하는 것과 비슷하다고 생각하면 된다.
@Subscribe은 필수고
(threadMode = "원하는 스레드 명") 은 선택사항이다.
나는 ble 연결이 성공, 실패 토스트를 띄워주고 싶었기 때문에 메인스레드로 정했다.
그리고 함수이름은 자유다.
하지만 이벤트버스의 단점이 어디서 이벤트를 받는지 찾기 어려운 점을 감안했을 때,
on + "이벤트객체이름" 으로 하는 것을 추천한다!!
이건 또 하나의 꿀팁이 될지 모르겠는데 회사코드를 보니까 전임자의 코드패턴이 유용하다고 생각해서 소개하고싶은 것이 있다.
전임자는 대개 팝업이나 토스트 등 UI를 띄울 때 이벤트버스로 베이스액티비티에 이벤트를 post해주었다.
이런 코드패턴을 사용하면 이벤트 버스의 단점인 어디서 이벤트를 받는지 찾기 어렵다는 점을 해소할 수 있을 것 같아서 좋은 아이디어라는 생각이 들었다.
개발하실 때 참고하시면 유용하게 사용할 수 있는 코드패턴이 될 것 같다.
댓글 없음:
댓글 쓰기