Development record of developer who study hard everyday.

레이블이 그린봇이벤트버스인 게시물을 표시합니다. 모든 게시물 표시
레이블이 그린봇이벤트버스인 게시물을 표시합니다. 모든 게시물 표시
, , , , , , ,

안드로이드 이벤트 버스 사용법

 

안드로이드 개발블로그

안드로이드 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해주었다.

이런 코드패턴을 사용하면 이벤트 버스의 단점인 어디서 이벤트를 받는지 찾기 어렵다는 점을 해소할 수 있을 것 같아서 좋은 아이디어라는 생각이 들었다.

개발하실 때 참고하시면 유용하게 사용할 수 있는 코드패턴이 될 것 같다.






Share:
Read More