EventBus简单使用及源码解析

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);
    }

在另外一个构造方法中࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EventBus是一个轻量级的事件发布/订阅库,可以方便地实现组件之间的通信。它可以大大简化应用程序中的消息传递,减少了代码的耦合度,从而提高了应用程序的可维护性和可扩展性。 使用EventBus,你需要在你的项目中添加EventBus库的依赖。在gradle配置文件中添加如下代码: ```groovy dependencies { implementation 'org.greenrobot:eventbus:3.2.0' } ``` 然后,你需要定义你的事件类,例如: ```java public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } ``` 接下来,订阅者需要在其onCreate()方法中注册到EventBus中: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } ``` 然后,你可以在订阅者中定义事件处理方法: ```java @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show(); } ``` 最后,当你想要发送一个事件时,你可以使用EventBus的post()方法: ```java EventBus.getDefault().post(new MessageEvent("Hello world!")); ``` 这个事件将被所有订阅者接收,并且可以在onMessageEvent()方法中处理。需要注意的是,当你不再需要接收事件时,你需要在onDestroy()方法中注销订阅者: ```java @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } ``` 这就是使用EventBus的基本方法。当然,EventBus还有很多高级用法,比如可以指定事件的优先级、自定义线程模式等等。你可以查看官方文档来了解更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值