-> 文章主要讲解Eventbus的原理及使用
Android EventBus
- eventbus 三要术(Event/Subscriber/Publisher)
Event : 事件 可以是任意类型的对象
Subscriber:事件订阅者 3.0 之前消息的处理方式限定于 onEvent\onEventMainThread\ onEventBackgroundThread 和 onEventAsync. 3,0之后的事件处理方式可以随意取名(类似Socket.io的通讯方式),但是要添加一个注解@Subscribe,并且指定线程模式(默认是POSTING)
Publisher 事件发布者 可以在任意线程任意位置发送事件、直接调用EventBus的post(Object)方法(Object对应的就是Event,可以是任意类型),可以自己实例化EventBus对象,但是一般使用EventBus.getDefault()就足够了。根据post函数参数的类型,会自动调用相印类型事件的函数
- EventBus ThreadMode(4)
POSTING(默认)事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件传递,甚至会引起ANR(application not responding)、即是默认,那么该事件在哪个线程发布出来的,事件处理函数就会在发布事件的源线程中执行,即发送事件和接受事件在同一个线程中,否则接受不到
Main 事件的处理会在UI线程中执行。应避免耗时操作,真的会ANR哦
BACKGROUND 乳沟事件是在UI线程中发不出来的,那么该事件的处理函数就会在
new thread子线程中执行,如果事件本来就在子线程中发布出来的,那么该事件处理函数就在发送事件的线程中执行,->在此事件处理函数中禁止进行UI更新操作。结束之后可以回到UI线程(Main)做界面更新ASYNC 无论事件在哪个线程中发布,该事件处理函数都会在
new thread子线程中执行,同样->在此事件处理函数中禁止进行UI更新操作。结束之后可以回到UI线程(Main)做界面更新
- 基本用法
- 自定义一个类
public class MessageEvent {
...
}
- 在需要订阅事件的地方注册事件
EventBus.getDefault().register(this)
- 发送事件
一般写在非当前页面,只有这样你才有使用它的必要
EventBus.getDefault().post(new MessageEvent())
- 处理事件
@Subscribe (threadMode = ThreadMode.MAIN)
Public void XXX(MessageEvent messageEvent)
- 取消事件订阅
应该选定在当前对象或者页面销毁的时机取消订阅
EventBus.getDefault().unregister(this)
thank ...