What
发布/订阅事件总线,
EventBus is an open-source library for Android and Java using the publisher/subscriber pattern for loose coupling. EventBus enables central communication to decoupled classes with just a few lines of code – simplifying the code, removing dependencies, and speeding up app development.
How
三要素
- Event: 事件, 任何类型
- Subscriber: 订阅者, 消息发布后, 接收消息
- Publisher: 发布者, 发布消息
开始使用
定义事件
public class MyEvent {
}
创建订阅者, 在接收事件的方法上贴上注解 @Subscribe
, 参数为四种线程模型, 稍后讲到, 方法名称随意, 一般为 onEvent
, 参数为订阅的事件.
public class MyEventSubscribe {
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEvent(MyEvent event){
// TODO
}
}
订阅者订阅 Event
, register
的参数为一个任意类型对象, 这个对象要存在一个方法被 @Subscribe
注解修饰
EventBus.getDefault().register(Obj);
取消订阅
EventBus.getDefault().unregister(Obj);
发布事件, post
参数为你定义的事件
EventBus.getDefault().post(Obj);
粘性事件
大概就是先发布, 后订阅也能接收到消息
EventBus 不同于 Handler
安卓中要注意的一点是, EventBus
的事件执行, 是没接受到一个事件, 如果线程指定为 ThreadMode.ASYNC
, 则会新建线程, 而不是复用一个线程, 这一点区分于 Handler
, 使用 Handler
是只要一个线程, 存在一个消息队列, 虚幻执行消息
ThreadMode(线程模型)
共四种
- POSTING(默认)
该事件在哪个线程发布出来的, 事件处理函数就会在这个线程中运行. 在线程模型为 POSTING
的事件处理函数中尽量避免执行耗时操作, 因为它会阻塞事件的传递, 甚至有可能会引起 ANR
.
- MAIN:
事件的处理会在UI线程中执行. 事件处理时间不能太长, 长了会 ANR
的.
- BACKGROUND:
如果事件是在 UI
线程中发布出来的, 那么该事件处理函数就会在新的线程中运行, 如果事件本来就是子线程中发布出来的, 那么该事件处理函数直接在发布事件的线程中执行. 在此事件处理函数中禁止进行 UI
更新操作.
- ASYNC:
无论事件在哪个线程发布, 该事件处理函数都会在新建的子线程中执行, 同样, 此事件处理函数中禁止进行UI更新操作.
网友评论