데브팜
Otto(Event Bus) 라이브러리 본문
Otto#
Otto를 알아보자!#
Otto는 Square에서 만든 EventBus형태의 라이브러리 입니다.
Event dispatcher라고 표현할 수 있는데
EventBus에 dispatcher & event producer & event subscriber 3가지 요소를 등록하면
Otto라이브러리가 producer와 subscriber 둘을 연결해주는 방식입니다.
Otto Homepage#
Otto Github#
https://github.com/square/otto
언제 사용하나요?#
(시간나면 추가 작성하겠음)
어떻게 사용하나요?#
Gradle 추가
compile 'com.squareup:otto:1.3.8' (최신버전 찾아서 넣으면 됨)
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(); } }
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(); }
날릴 Event Class 정의
Event Class는 전달한 파라미터가 없이 Event 여부만 알고자 한다면 빈 Class여도 됨.public class MyEvent { int index; public MyEvent(int index) { this.index = index; } public int getIndex() { return index; } }
Event 전달받을 함수
함수명과 Event Class는 자유임.@Subscribe public void FinishLoad(MyEvent mEvent) { // 이벤트가 발생한뒤 수행할 작업 }
Event 날리기
BusProvider.getInstance().post(new MyEvent(index));
주의할 점#
Interface같이 이벤트를 호출하고 받는 부분이 명시되어 있지 않기때문에
직접 작성한 코드가 아니라면 연관관계를 한번에 알기 어려울 수 있다.
꼭 필요한 이벤트 클래스 만을 사용하여 코드가 혼잡해지는 것을 방지해야 한다.register / unregister 선언을 중복하여 실행할 경우 앱이 죽는다. (중복선언할 경우 Exception남)
생명 주기를 이해한 후 사용하는 것이 좋다.
!!예시 코드를 보면 register/unregister 반복호출시 죽는 문제를 해결하고자
object list를 선언하고, 중복확인 후 register / unregister 작업을 진행하도록 하였다.activity(fragment)와 adapter 사이에선 EventBus 사용하기 어렵다.
Adapter는 생명주기가 뚜렷하지 않기 때문에 사용하기가 까다롭다.
Activity->Adapter에 이벤트를 전달하기보다는 Activity에서 Adapter 안의 함수를 직접 호출하는 것이 간결하다.
'Android' 카테고리의 다른 글
드로이드 나이트 Droid Knight 2018가 개최됩니다!! (0) | 2018.03.29 |
---|---|
Carbon 라이브러리 (0) | 2018.01.03 |
[Android] int와 integer의 차이 (0) | 2017.06.15 |
[Android] 'ActivityThread.getApplicationThread()' on a null object reference (0) | 2017.06.07 |
[Android] Thread 관련 에러 (Only the original thread that created a view hierarchy can touch its views.) (2) | 2017.06.01 |