前言
之前在公司写项目的时候需要用到EventBus来进行通信,自己也稍微学习了一点,对EventBus有一些理解,不足之处还请见谅。
一、EventBus是什么?
- EventBus(事件总线)是一个Android端优化的 发布/订阅 消息总线。简化了应用程序内各个组件、组件与后台线程间(活动Activity、碎片Fragment、进程Thread、服务Service等)的通信方式。
- EventBus 三个角色
Event:事件。可以是任意类型,EventBus根据事件类型进行全局通知。
Subscriber:事件订阅者。事件方法名任意取名,需要加上注解@subscribe,并指定线程模型,EventBus 3.0 有四种线程模型(订阅者 & 发布者可位于任意线程),分别是:
POSTING:默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。
MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。若当前线程不是主线程,则通过Handler将消息发送给主线程。
BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
Publisher:事件发布者。可在任意线程里发布事件
二、使用示例
- 引入依赖
:implementation 'org.greenrobot:eventbus:3.1.1'
- 定义对象
//定义一个message来进行消息传递
class MessageInfo(var message: String)
- 定义订阅者,注册事件 & 处理事件
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//使用EventBus的接收方法的Activity,需要注册监听
EventBus.getDefault().register(this)
})
}
//这里使用粘性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun getNetWork(messageInfo: MessageInfo) {
msg = messageInfo.message
activity?.runOnUiThread {
tv_net?.text = msg
}
}
override fun onDestroy() {
super.onDestroy()
//注销监听
EventBus.getDefault().unregister(this)
}
- 定义发布者,发布事件
//调用方法进行发布
fun refreshNet() {
val msg: String = getString(R.string.current_net, NetWorkUtils().checkNetworkTypeStr(this))
var messageInfo: MessageInfo? = MessageInfo(msg)
EventBus.getDefault().postSticky(messageInfo)
}