본문 바로가기

Android/note

[android] Event Bus

firebase를 사용하며 데이터를 꺼내올 때

데이터를 조회하는 속도가 느린 것 같아서 어떻게하면 좋을지 검색해보다가 알게 된 이벤트 버스!

데이터를 주고 받을 때 많이들 사용하는 것 같다.

 

처음에 여러 사람들의 블로그를 보며 적용해보다가

나의 부족한 이해력때문에 어디에 어떤 코드를 넣어야하는지 잘 이해가 되지 않았다.

그러므로 이 글은 미래의 나를 위해 작성하는 포스팅,,

근데 사용하는 방법도 쉽고 간단해서 자주 쓰게될 것 같다!

 

라이브러리
 

GitHub - greenrobot/EventBus: Event bus for Android and Java that simplifies communication between Activities, Fragments, Thread

Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality. - GitHub - greenrobot/EventBus: Event bus for Android ...

github.com

라이브러리에서 확인한 후 Gradle 또는 Maven에 추가한다.

 

이벤트 버스의 동작

post()를 사용하여 이벤트를 발동시키면 이벤트 버스에서 각각 해당되는 이벤트들을 발동시킨다.

 

이벤트 버스
1. 이벤트 버스는 컴포넌트들 사이에서 의사소통을 단순화한다.
=> 이벤트를 발동시키는 발신자와 이벤트를 받는 수신자를 분리하였다.
=> 액티비티, 프레그먼트, 백그라운드 쓰레드에서 잘 수행한다.
=> 복잡하고 에러가 발생하기 쉬운 의존성과 생명주기의 문제를 피한다.
2. 코드를 더 간단하게 만든다.
3. 빠르다.
4. 가볍다.
5. 수 많은 앱들이 사용했기 때문에 입증되었다.
6. 고급 기능이 있다.

 

내가 사용한 코드를 예를 들었을때

나는 데이터베이스에서 데이터를 조회한 후 액티비티의 어댑터로 데이터를 전달하고 싶었다.

 

 

사용 방법

 

1. 이벤트 클래스 내용 정의

 

클래스를 만들어서 메소드를 작성하는데 알고보니 생성자를 이용해서 받아오는 거였다. 

 

2. 이벤트를 보내는 쪽에서 이벤트 발동

 

=> EventBus.getDefault().post(new 이벤트클래스명(매개변수));

이벤트를 발동하는 곳 : 데이터를 전달하려는 곳(나의 경우에는 DAO)

 

3. 이벤트 받기

 

이벤트를 받는 곳 : 나의 경우에는 액티비티

여기서 사용되는 메소드명은 상관없는 것 같다!

왜 그렇게 생각했냐면 따로 사용하는 것이 아니라 이벤트 버스가 발동되었을 때만 사용되는 것같아서?

어노테이션으로 @Subscribe(threadMode = ThreadMode.MAIN)을 작성해주어야 한다.

이 뜻은 메인 쓰레드에서 동작하겠다는 것!

 

4. Register / unregister 작성(이벤트를 받는쪽)

 

깃허브를 보면 onStart()와 onStop()에 register와 unregister를 작성하는 것을 권장한다.

액티비티, 프레그먼트의 생명주기에 따라 등록되고 해제되어야 하기 때문이다.

이벤트를 작동하는 쪽(EventBus.getDefault()를 사용하는쪽)이 아닌 이벤트를 받는 쪽에 작성해야 한다!

 

ThreadMode
 

Delivery Threads (ThreadMode) - Open Source by greenrobot

Learn how to use Deliver Threads (ThreadMode) in EventBus with this tutorial / documentation. EventBus can handle threading for you. Have fun.

greenrobot.org