博客: 安卓之家
微博: 追風917
CSDN: 蔣朋的家
簡書: 追風917
EventBus3 簡介
EventBus Android 發布/訂閱事件總線,可簡化 Activities, Fragments, Threads, Services 等組件間的消息傳遞,可替代 Intent, Handler, BroadCast ,接口等傳統方案,更快,代碼更小,50K 左右的 jar 包,代碼更優雅,徹底解耦。EventBus3 是最新版本,官網地址:
https://github.com/greenrobot/EventBus
使用
這里簡單介紹下使用方法:
1 添加依賴 compile 'org.greenrobot:eventbus:3.0.0'
2 編寫事件類
3 post 發布事件
這里有直接發布和滯留發布
//直接發布
EventBus.getDefault().post("直接發布");
//滯留發布
EventBus.getDefault().postSticky("滯留發布");
注意可以發布的是一個 Object
類,發送什么,訂閱者就會接收什么。
此處要注意兩個地方:
-
如果 post 字節數據,此時訂閱者的方法里參數需為 Byte,而不是 byte,同樣的,post int數據,訂閱方法參數需為 Interger,其他基本數據類型同理
-
如果 post 字符串,那么所有方法的參數是 String 類型的訂閱者都會接收到事件而執行方法。
4 訂閱者接收事件
訂閱的時候要注冊和取消注冊。
注冊一般是在 onCreate
和 onStart
里注冊,盡量不要在 onResume
,可能出現多次注冊的情況,比如下面這個異常::
EventBusException: Subscriber class already registered to event class
可以先判斷下:
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
參看這里:GreenRobot EventBusException: Subscriber class already registered to event class
取消注冊 要寫到 onDestroy
方法里,不要寫到 onStop
里,有時會出現異常的哦
EventBus 3 和之前版本的 EventBus 不兼容,這里采用注解的方法來接收事件,四種注解 @Subscrible
、@Subscrible(threadMode = ThreadMode.ASYNC)
、@Subscribe(threadMode = ThreadMode.BACKGROUND)
、@Subscribe(threadMode = ThreadMode.MAIN)
分別對應之前的 onEvent()
、onEventAsync()
、onEventBackground()
、onEventMainThread()
。
EventBus 3 采用注解后,方法名沒有限制了,參數只有一個,和發送者 post 的參數對應配對,在未聲明 threadMode 時,默認的線程模式為 ThreadMode.POSTING,只有在該模式下才可以取消線程,否則容易導致如下異常:
org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
由於可在任何地方都可以 post 一個事件,那么在不同線程之間傳遞事件,比如在工作線程傳遞一個事件更新UI線程中的一個控件,則需要注意 threadMode 的切換。
好了,基本使用大概就這些,后面遇到會補充...
2016.07.13補充:
今天遇到了訂閱事件無法執行的情況,分析后發現是訂閱事件的 Activity
還未執行的原因。
找到原因就好辦了,這時候就需要用到 postSticky
。
發布事件時用 postSticky
操作:
EventBus.getDefault().postSticky(event);
訂閱時,添加 sticky = true
@Subscribe(sticky = true) //看下 `@Subscribe` 源碼知道 `sticky` 默認是 `false`
public void onEvent(Event e) {
---
}
這里也有個坑,就是 EventBus.getDefault().register(this);
注冊時最好放到各變量初始化最后,否則可能會出現一些變量空指針異常。
混淆
沒什么說的,復制下面代碼到你的混淆文件即可:
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode {
*;
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
發布的事件多了以后,我們很難去管理,下面推薦個 AS 插件:
https://github.com/kgmyshin/eventbus3-intellij-plugin

更多 AS 插件請訪問:https://github.com/jp1017/AndroidStudioPlugins
欲知更多 EventBus 的內容,還可參考:
EventBus3新特性及用法
EventBus 源碼解析
Android EventBus源碼解析 帶你深入理解EventBus
最后,非常感謝您的閱讀,有任何疑問,可以后面評論,謝謝!
神奇的安卓開發網站:http://androidcat.com/
安卓開源庫收集整理:https://github.com/XXApple/AndroidLibs
分享是一種美德,更是一種生活方式!!
也許你會說我是一個夢想者,但我不是唯一的一個。
悅分享,越快樂_
歡迎交流,轉載請注明出處,謝謝!