집요정 도비의 일기
EventBus로 여기저기서 쉽게 콜백 받기 본문
0. Intro
개발하다보면 비동기 요청의 리스폰스를 안드로메다에서 받을 일이 생김. 대표적으로 Ble가 그럼. 예를들어 다음과 같은 순서로 ble장치로 통신을 보내고 받는 경우다.
(1) View에서 유저의 버튼 클릭으로 ble전송 요청이 들어옴
(2) 적절한 클래스에서 장치에 쓸 byte값을 세팅함.
(3) Ble service단에서 연결된 ble장치를 향해 바이트를 씀.
(4) Ble service내에서 onCharacteristicChanged에서 장치로부터 받은 콜백을 수신함.
(5) 이 결과값을 처음의 view에 전달해야함.
결국 (5)를 어캐 좀 편하게 해보려고 쓰는 것이다. 필자의 경우, 이벤트 버스를 사용하지 않았을 때는 뷰의 메소드를 static으로 정의하여 처리하는 식으로 구현하였으나, 보기 좋은 코드와는 거리가 멀었다. 게다가, 만약 같은 리퀘스트를 서로 다른 액티비티에서 날릴 수 있다면, 어떤 액티비티의 static 콜을 해야할지 골머리를 앓게 된다. 이벤트 버스는 이런 상황에서 더없이 유효하다.
1. 소개
이벤트 버스란...
(1) 아무 조건 없이 어디서든 클래스 단위로 이벤트를 던질 수 있다.
(2) 이벤트를 수신 받기 원하는 곳을 eventbus에 register해두면 이벤트를 수신 받을 수 있다.
(3) 이벤트를 더 이상 받고 싶지 않다면 unregister한줄만 해주면 된다.
2. 설정
build.gradle의 dependency에 다음과 같이 한줄을 추가한다.
compile 'org.greenrobot:eventbus:3.0.0'
3. 구현
(1) 이벤트는 클래스로 표현된다. 아래의 이벤트 클래스를 보자.
public class TestEvent {
public final String helloEventBus;
public TestEvent(String helloEventBus) {
this.helloEventBus = helloEventBus;
}
}
(2) 이벤트를 받기 원하는 곳에 이벤트 버스에 register하는 코드를 추가한다.
@Override
protected void onResume() {
super.onResume();
try{
EventBus.getDefault().register(this);
}catch (Exception e){}
}
보통 라이프사이클에 맞춰서 이벤트를 받거나 더 이상 받지 않을지를 결정하기 때문에, 라이프 사이클 콜백에 구현해둔다.
(3) (2)의 클래스에 (1)에서 구현한 TestEvent를 받는 메소드를 작성한다.
@Subscribe(threadMode = ThreadMode.MAIN)
public void testEvent(TestEvent event){
Log.e("test_event", "Hello" +event.helloEventBus + "!!");
}
EventBus.getDefault().post(new TestEvent("Dobby"));
위와 같은 코드 한줄이면 (3)으로 이벤트가 들어간다.
(5) 이벤트 버스를 해재한다.
@Override
protected void onStop() {
try{
EventBus.getDefault().unregister(this);
}catch (Exception e){}
super.onStop();
}
'개발 일기' 카테고리의 다른 글
Apply Digest Auth to Exoplayer (0) | 2021.01.29 |
---|---|
FindViewById 노가다 그만합시다. Prettify로 1초만에 findViewById 자동으로 다 하기. (0) | 2017.03.12 |
Retrofit 2로 Json파싱 없이 Http통신 구현 시간을 단축해보자. (1) | 2016.11.07 |
selector auto creator (0) | 2016.10.18 |
Step 4. 음악 스트리밍 서버(Spring boot), 앱(Android)을 만들어보자. (6) | 2016.03.05 |