EventBus简介
EventBus是一个用于 Android 和 Java 的开源库,使用发布者/订阅者模式进行松散耦合。EventBus 只需几行代码即可实现与解耦类的集中通信——简化代码、消除依赖关系并加快应用程序开发。
使用EventBus的好处:
- 简化组件之间的通信
- 解耦事件发送者和接收者
- 在 UI 工件(例如活动、片段)和后台线程中表现良好
- 避免复杂且容易出错的依赖关系和生命周期问题
- 快;专为高性能而优化
- 很小(~60k jar)
- 已被安装超过 1,000,000,000 次的应用在实践中证明
- 具有交付线程、订阅者优先级等高级功能。
EventBus的简单使用
首先引入依赖:
implementation 'org.greenrobot:eventbus:3.3.1'
MainActivity.kt:
class MainActivity : AppCompatActivity() {
private lateinit var btnOne: Button
private lateinit var tvContent: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
EventBus.getDefault().register(this)
initView()
}
private fun initView() {
btnOne = findViewById(R.id.btn_one)
tvContent = findViewById(R.id.tv_content)
btnOne.setOnClickListener {
startActivity(Intent(this, SecondActivity::class.java))
}
}
@Subscribe
fun onMessageEvent(event: MessageEvent) {
tvContent.text = event.msg
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}
SecondActivity.kt:
class SecondActivity : AppCompatActivity() {
private lateinit var btnOne: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
initView()
}
private fun initView() {
btnOne = findViewById(R.id.btn_one)
btnOne.setOnClickListener {
EventBus.getDefault().post(MessageEvent("TextView的内容改变了"))
}
}
}
MessageEvent.kt:
data class MessageEvent(var msg: String?)
操作流程:
点击MainActivity中的button跳转到SecondActivity后再返回MainActivity,可以看到MainActivity中的TextView的内容已变成”TextView的内容改变了“
EventBus源码解析
EventBus创建
在使用eventBus的时候一般我们都是用的EventBus.getDefault()这个方法,下面看下getDefault的源码:
public static EventBus getDefault() {
EventBus instance = defaultInstance;
if (instance == null) {
synchronized (EventBus.class) {
instance = EventBus.defaultInstance;
if (instance == null) {
instance = EventBus.defaultInstance = new EventBus();
}
}
}
return instance;
}
可以看到是用双检锁单例创建了一个EventBus实例。
在EventBus的构造方法中可以看到又调用了另一个构造方法,而且带了一个EventBusBuilder类型的DEFAULT_BUILDER:
public EventBus() { this(DEFAULT_BUILDER); }
在另外一个构造方法中