EventBus是一款轻量级事件发布/订阅轻量级框架,可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
注册和取消注册
在activity的生命周期中,进行注册的取消注册的操作。如在onCreate中注册,在onDestroy中取消注册。
//注册
EventBus.getDefault().register(MainActivity.this);
//取消注册
EventBus .getDefault().unregister(MainActivity.this);
创建消息类
消息类可以根据自己的需求任意实现,但注意post时传递的参数和订阅方法中的参数对应。
EventBus.getDefault().post(new EventBusMessage("hello word"))
@Subscribe(threadMode = ThreadMode.POSTING)
public void MessageEventBus1(EventBusMessage eventBusMessage){
}
线程模式
ThreadMode.POSTING 订阅者方法将在发布事件所在的线程中被调用。这是默认模式。
ThreadMode.MAIN 订阅者方法将在主线程(UI线程)中被调用。
ThreadMode.MAIN_ORDERED 订阅者方法将在主线程(UI线程)中被调用。事件将先进入队列然后才发送给订阅者。
ThreadMode.BACKGROUND 订阅者方法将在后台线程中被调用。如果发布事件的线程不是主线程,那么订阅者方法将直接在该线程中被调用。如果发布事件的线程是主线程,那么将使用一个单独的后台线程,该线程将按顺序发送所有的事件。
ThreadMode.ASYNC 订阅者方法将在一个单独的线程中被调用。
黏性事件
黏性事件: 新订阅者仍能接受到先前发布的事件。
正常情况下在事件发布后才订阅该事件的订阅者无法接受到该事件。若此事件为黏性事件,eventBus则会缓存这些黏性事件,新订阅者将会受到所有的黏性事件,除非黏性事件被删除。
// 订阅粘性事件
@Subscribe(sticky = true)
public void onMessageEvent(MessageEvent event) {
...
}
// 发布粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus!"));
// 移除指定的粘性事件
removeStickyEvent(Object event);
// 移除指定类型的粘性事件
removeStickyEvent(Class<T> eventType);
// 移除所有的粘性事件
removeAllStickyEvents();
事件优先级
在相同线程模式的情况下,优先级高的订阅方法会被优先调用。数值越大优先级越高。
@Subscribe(priority = 1)
public void onMessageEvent(MessageEvent event) {
...
}
可以在高优先级的方法内取消该事件的传递,使得低优先级的方法不被调用。只有Posting线程模式下才能取消事件的传递。
@Subscribe(threadMode = ThreadMode.POSTING, priority = 1)
public void onMessageEvent(MessageEvent event) {
...
// 取消事件传递
EventBus.getDefault().cancelEventDelivery(event);
}