Android第三方开源框架——EventBus

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!"));

你可能感兴趣的:(Android第三方开源框架——EventBus)