Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

집요정 도비의 일기

EventBus로 여기저기서 쉽게 콜백 받기 본문

개발 일기

EventBus로 여기저기서 쉽게 콜백 받기

집요정_도비 2016. 12. 28. 15:11

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 + "!!");
}

(4) 어디서든 이벤트를 전송해보자.

EventBus.getDefault().post(new TestEvent("Dobby"));

백그라운드 쓰레드건, 서비스건 어디서 보내도 상관없다. 위에서 ThreadMode가 main으로 설정되어 있기 떄문에, 이벤트를 받은 후의 작업은 main쓰레드에서 진행된다.


위와 같은 코드 한줄이면 (3)으로 이벤트가 들어간다.


(5) 이벤트 버스를 해재한다.

@Override
protected void onStop() {
try{
EventBus.getDefault().unregister(this);
}catch (Exception e){}
super.onStop();
}

액티비티가 전환되면 보통 이벤트 버스를 해재한다. 해재하지 않으면 계속 이쪽으로도 이벤트가 들어오기 때문이다. 이벤트 버스가 register되어 있는 모든 클래스들에 이벤트를 뿌린다.



Comments