参考文章:EventBus使用详解
一、EventBus基本使用
1.定义传递事件类
public class MessageEvent {
public String Message;
public MessageEvent(String message) {
Message = message;
}
}
2.设置事件订阅者
/*
订阅者
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void getMessage(MessageEvent messageEvent)
{
button.setText(messageEvent.Message);View
}
在ThreadMode 枚举中定义了4个线程模式
1、PostThread:事件响应函数和事件发布在同一线程中执行。这个是默认值,这样可以避免线程切换。
2、MainThread:事件响应函数会在Android应用的主线程(大部分情况下都是UI线程)中执行。
3、BackGround:事件响应函数会在一个后台线程中执行。如果事件发布函数不是在主线程中,则会立即在事件发布线程中执行响应函数。如果事件发布函数在主线程中,EventBus则会在唯一的一个后台线程中按照顺序来执行所有的后台事件响应函数。
4、Async:事件响应函数在另外一个异步线程中执行。该线程和发布线程、主线程相互独立。如果事件响应函数需要较长的时间来执行,则应该使用该模式,例如 网络访问等。需要注意的是,由于系统并行的限制,应该避免在同一时间触发大量的异步线程。 EventBus使用一个线程池来提高线程的效率。
3.在总线上注册
一般在onCreate的时候注册,onDestroy的时候销毁。
EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);
4.发布事件
EventBus.getDefault().post(new MessageEvent("EventBus牛逼!"));
2、粘性事件
如果先发布了事件,然后有订阅者订阅了该事件,那么除非再次发布该事件,否则订阅者将永远接收不到该事件。此时,可以使用粘性事件。
发布一个粘性事件之后,EventBus将在内存中缓存该粘性事件。当有订阅者订阅了该粘性事件,订阅者将接收到该事件。
// 订阅粘性事件
@Subscribe(sticky = true)
public void onMessageEvent(MessageEvent event) {
...
}
// 发布粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus!"));
发布一个粘性事件之后,EventBus将一直缓存该粘性事件。如果想要移除粘性事件,那么可以在订阅者上使用如下方法:
// 移除指定的粘性事件
EventBus.getDefault().removeStickyEvent(event);
// 移除指定类型的粘性事件
EventBus.getDefault().removeStickyEvent(Class<T> eventType);
// 移除所有的粘性事件
EventBus.getDefault().removeAllStickyEvents();
3.事件优先级
EventBus支持在定义订阅者方法时指定事件传递的优先级。默认情况下,订阅者方法的事件传递优先级为0。数值越大,优先级越高。在相同的线程模式下,更高优先级的订阅者方法将优先接收到事件。注意:优先级只有在相同的线程模式下才有效。
/*
订阅者
*/
@Subscribe(threadMode = ThreadMode.MAIN,priority = 10)
public void getMessage(MessageEvent messageEvent)
{
button.setText(messageEvent.Message);
}