EventBus是Android时间总线,主要用于各组件之间的通信,降低各组件之间通行的通信的复杂程度。
三个基本概念
- Event(事件):他其实是一个对象,但是我们可以理解为消息,然而事件又分为一般事件和粘性事件(Sticky);粘性事件类似于粘性广播,在事件发出后,如果有Subscriber(订阅者)订阅,依然能收到订阅消息。
- Publisher(发布者):发布的是某事件的对象,通过post接口发布事件。
- Subscriber(订阅者):订阅的是某种事件类型的对象。当发布者发布事件后,EventBus执行Subscriber(订阅者)的事件响应函数onEvent()对事件进行处理。
定义事件
class MessageEvent {
var message:String? = null
}
注册与注销
一般在onCreate()中注册,
override fun onCreate(savedInstanceState: Bundle?) {
...
EventBus.getDefault().register(this)
}
在onDestroy()中注销。
override fun onDestroy() {
...
EventBus.getDefault().unregister(this)
}
事件响应方法
EventBus实现简单的现成切换,包括后台线程、UI线程、异步线程.
//调用post方法的线程是主线程
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventMain(event: Event?) {
...
...
}
// //默认调用方式,在调用post方法的线程执行,避免了线程切换,性能开销最少
@Subscribe(threadMode = ThreadMode.POSTING)
fun onEventPosting(event: Event?) {
...
...
}
// 如果调用post方法的线程不是主线程,则直接在该线程执行
// 如果是主线程,则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,避免耗时操作
@Subscribe(threadMode = ThreadMode.BACKGROUND)
fun onEventBackgroud(event: Event?) {
...
...
}
//开辟新独立线程,用来执行耗时操作,例如网络访问
//EventBus内部使用了线程池,但是要尽量避免大量长时间运行的异步线程,限制并发线程数量
//可以通过EventBusBuilder修改,默认使用Executors.newCachedThreadPool()
@Subscribe(threadMode = ThreadMode.ASYNC)
fun onEventAsync(event: Event?) {
...
...
}
发送事件
EventBus.getDefault().post(MessageEvent("Hello EventBus!"));
网友评论