Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
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
Tags
more
Archives
Today
Total
관리 메뉴

데브팜

Otto(Event Bus) 라이브러리 본문

Android

Otto(Event Bus) 라이브러리

퓨새 2018. 1. 2. 13:39

Otto#

676-201712-28-1728-52.png

Otto를 알아보자!#

Otto는 Square에서 만든 EventBus형태의 라이브러리 입니다.

Event dispatcher라고 표현할 수 있는데
EventBus에 dispatcher & event producer & event subscriber 3가지 요소를 등록하면
Otto라이브러리가 producer와 subscriber 둘을 연결해주는 방식입니다.

Otto Homepage#

http://square.github.io/otto/

Otto Github#

https://github.com/square/otto

언제 사용하나요?#

(시간나면 추가 작성하겠음)

어떻게 사용하나요?#

  1. Gradle 추가

     compile 'com.squareup:otto:1.3.8' (최신버전 찾아서 넣으면 됨)
    
  2. Otto를 관리해주는 Singleton 개념의 BusProvider class 생성

    public final class BusProvider extends Bus {
    
     // 같은 object의 중복 register를 방지하기 위해 registeredObjects(list) 생성
     private ArrayList registeredObjects = new ArrayList();
     private static final BusProvider BUS = new BusProvider();
    
     public static BusProvider getInstance(){
         return BUS;
     }
     private BusProvider(){
         //no instance.
     }
    
     //object register
     @Override
     public void register(Object object) {
         if(!registeredObjects.contains(object)){
             registeredObjects.add(object);
             super.register(object);
         }
     }
    
     //object unregister
     @Override
     public void unregister(Object object) {
         if(registeredObjects.contains(object)){
             registeredObjects.remove(object);
             super.unregister(object);
         }
     }
    
     //전체 object unregister
     public void allUnregister(){
         for(int i=0; i<registeredObjects.size(); i++){
             Object object = registeredObjects.get(i);
             unregister(object);
         }
         registeredObjects.clear();
         registeredObjects = new ArrayList();
     }
    }
    
  3. Event를 감지하고자 하는 Activity나 Fragment에서 register 실행

     @Override
     protected void onCreate(Bundle arg0) {
         super.onCreate(arg0);
         // Register ourselves so that we can provide the initial value.
         BusProvider.getInstance().register(this);
     }
    
     @Override
     protected void onDestroy() {
         // Always unregister when an object no longer should be on the bus.
         BusProvider.getInstance().unregister(this);
         super.onDestroy();
     }
    
  4. 날릴 Event Class 정의
    Event Class는 전달한 파라미터가 없이 Event 여부만 알고자 한다면 빈 Class여도 됨.

    public class MyEvent {
     int index;
    
     public MyEvent(int index) {
         this.index = index;
     }
    
     public int getIndex() {
         return index;
     }
    }
    
  5. Event 전달받을 함수
    함수명과 Event Class는 자유임.

     @Subscribe
     public void FinishLoad(MyEvent mEvent) {
     // 이벤트가 발생한뒤 수행할 작업
     }
    
  6. Event 날리기

    BusProvider.getInstance().post(new MyEvent(index));
    

주의할 점#

  1. Interface같이 이벤트를 호출하고 받는 부분이 명시되어 있지 않기때문에
    직접 작성한 코드가 아니라면 연관관계를 한번에 알기 어려울 수 있다.
    꼭 필요한 이벤트 클래스 만을 사용하여 코드가 혼잡해지는 것을 방지해야 한다.

  2. register / unregister 선언을 중복하여 실행할 경우 앱이 죽는다. (중복선언할 경우 Exception남)
    생명 주기를 이해한 후 사용하는 것이 좋다.
    !!예시 코드를 보면 register/unregister 반복호출시 죽는 문제를 해결하고자
    object list를 선언하고, 중복확인 후 register / unregister 작업을 진행하도록 하였다.

  3. activity(fragment)와 adapter 사이에선 EventBus 사용하기 어렵다.
    Adapter는 생명주기가 뚜렷하지 않기 때문에 사용하기가 까다롭다.
    Activity->Adapter에 이벤트를 전달하기보다는 Activity에서 Adapter 안의 함수를 직접 호출하는 것이 간결하다.