EventBus的作用類似廣播。簡化應用各組件之間的通信。
compile 'org.greenrobot:eventbus:3.1.1'
三要素
- Event:事件,可以是任意類型的對象。
- Subscriber:事件訂閱者,在EventBus3.0事件處理的方法可以隨便取名,但是需要添加一個注解@Subscribe。
- Publisher:事件發布者,可以在任意線程任意位置發送事件,直接調用EventBus的post(Object)方法。根據post函數參數的類型,會自動調用訂閱相應類型事件的函數。
ThreadMode(線程模型)
POSTING(默認):該事件在哪個線程發布出來的,事件的處理就會在這個線程中運行,也就是說發布事件和接收事件在同一個線程。發布者和訂閱者處與同一線程。
MAIN: 事件處理會在UI線程中執行。事件處理時間不能太長,長了會ANR的。訂閱者在主線程(與發布者無關)
BACKGROUND:如果事件是在UI線程中發布出來的,那么該事件處理就會在新的子線程中運行,如果事件本來就是子線程中發布出來的,那么該事件處理函數直接在發布事件的線程中執行。在此事件處理函數中禁止進行UI更新操作。訂閱者在子線程(與發布者無關)
-
ASYNC:無論事件在哪個線程發布,該事件處理都會在新建的子線程中執行,同樣,此事件處理函數中禁止進行UI更新操作。
?
EventBus簡單用法
1、新建事件模型
public class MessageEvent {
}
2、在需要訂閱事件的地方先注冊事件
EventBus.getDefault().register(this);
3、發送事件
EventBus.getDefault().post(new MessageEvent());
4、處理事件
@Subscribe(threadMode = ThreadMode.MAIN) //不寫threadMode會默認POSTING
public void eventListener(MessageEvent messageEvent) {
//方法名隨意 但是要加上@Subscribe
}
5、注銷事件訂閱
EventBus.getDefault().unregister(this);
如果是Activity訂閱事件 注冊和注銷事件訂閱可以卸載onCreate()
和onDestroy()
。
事件優先級
//priority越大,級別越高
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100)
public void onEvent(MessageEvent event) {
}
終止事件
// 注意中止事件傳遞,后續事件不在調用
@Subscribe
public void onEvent(MessageEvent event){
EventBus.getDefault().cancelEventDelivery(event) ;
}
粘性事件
就是在發送事件之后再訂閱該事件也能收到該事件,跟黏性廣播類似。
EventBus.getDefault().postSticky(new MessageEvent("粘性事件"));
資料: