本期blog做爲EventBus(如下簡稱EB)學習的始動篇,主要記載了EB的功能、優勢、使用方法,內容基於github上的README.md與HOWTO.md。java
EB實現了Android上的一種事件分發/接收總線機制,其優勢能夠歸納爲如下三條:git
將EventBus引入到項目中(gradle) github
compile 'de.greenrobot:eventbus:2.4.0'
分發事件緩存
eventBus.post(anyEvent);
接收事件網絡
eventBus.register(this); public void onEvent(AnyEvent e) {/* do something */};
以上就是很是簡單的EventBus使用方法,下面是部分進階內容:)異步
在實際開發中,每每須要根據需求的不一樣(是UI變化仍是網絡請求等),在不一樣的線程中進行邏輯處理。EB經過在接收者中使用不一樣的方法命名,爲咱們提供了簡便的處理方法,無須深刻到複雜的線程內部。ide
在接收者中以方法名onEventXXX來使用不一樣的線程模式。post
一般簡便的獲取EventBus實例是經過 EventBus.getDefault() 來獲取單例,當須要對其進行定製時,能夠經過EventBusBuilder進行。學習
EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build(); // 當沒有對應接收者時,不發送消息
更多的用法能夠參閱javadocgradle
若是想對默認的EB單例進行定製,須要在初次調用EventBus.getDefault()以前進行,一般建議放在Application類中。
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).installDefaultEventBus();
在onEvent中經過eventBus.cancelEventDelivery(event)能夠終止該Event的繼續分發
具備更大優先級的接收者,會優先處理信息,能夠搭配上一條(終止Event分發)使用。
int priority = 1; EventBus.getDefault().register(this, priority);
不知道怎樣恰當翻譯(粘性事件?)。EB內建了一個微型的緩存機制,能夠保存最近一次以Sticky形式發送的Event,當接收者(鬚生命爲Sticky)註冊的時間晚於最近一個StickyEvent時,仍然能夠接收到該Event。
發送StickyEvent
EventBus.getDefault().postSticky(someEvent);
接收StickyEvent
@Override public void onStart() { super.onStart(); EventBus.getDefault().registerSticky(this); } public void onEvent(SomeEvent e) { /* do something */ } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); }
獲取上一個StickyEvent
EventBus.getDefault().getStickyEvent(Class<?> eomeEventType);
由於ProGuard會對方法名進行混淆,而EB是基於反射完成的,故須要在ProGuard文件(proguard.cfg)中配置特殊規則
-keepclassmembers class ** { public void onEvent*(**); } # Only required if you use AsyncExecutor -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { <init>(java.lang.Throwable); }
非核心功能,暫且略過不表。