EventBus原理与源码解析

一、概述 

      EventBus是针对Android优化的发布-订阅事件总线,简化了Android组件间的通信。EventBus以其简单易懂、优雅、开销小等优点而备受欢迎。

      关于EventBus的基本使用不再详述,网上的资料很多,可以自行学习,或者直接去GitHub上查看基本使用方法

      在讲解源码之前,先说一下EventBus需要关注的点 - EventBus支持的四种线程模式(ThreadMode):

      示例:

@Subscribe(threadMode = ThreadMode.POSTING)
    public void eventBus(MyEvent myEvent) {
        Toast.makeText(this, "呵呵哒", Toast.LENGTH_SHORT).show();
    }

      a)POSTING(默认):事件在哪个线程发布,就在哪个线程消费,因此要特别注意不要在UI线程进行耗时的操作,否则会ANR;

      b)MAIN:事件的消费会在UI线程。因此,不宜进行耗时操作,以免引起ANR。

      c)BACKGROUND:如果事件在UI线程产生,那么事件的消费会在单独的子线程中进行。否则,在同一个线程中消费。

      d)ASYNC:不管是否在UI线程产生事件,都会在单独的子线程中消费事件。

另外,EventBus还支持粘性事件,即发送一个未注册的粘性事件,注册者会在完成注册之后收到这个粘性事件。

二、原理

在开始解析源码之前,还是那句话,没有一张图解决不了的问题,如果不是那就是两张图。`(*∩_∩*)′


上图是EventBus整体的运行图。事件的发布与事件的消费可能位于一个线程,也可能位于不同的线程。这取决于我们注册消费方法的时候设置的ThreadMode。

每一个线程都有一个与之关联的Queue(通过ThreadLocal办到的),事件被发布到Queue中,循环遍历Queue中的Event,并根据Event查找可以消费该事件的类(MainActivity)与方法(@Subscribe)。最终将事件交给消费方法完成一次完整的发布与消费过程。

技术关键点:Java 反射ThreadLocal & Queue、单例模式、建造者模式

速记技巧点:EventBus的以反射开始 - 注册、以反射结束 - 事件的消费。

本文目标:解析事件的注册、消费、解注册过程。

总得来说,与之前看过的其他开源库的源码相比,EventBus的源码还是很容易品尝的(前提是你掌握了上文提到的技术关键点)。下面开始喽。

三、源码解析

3.1、构造EventBus

单例模式:

EventBus.getDefault()
无论是事件的注册、解注册、发布,我们都会用到这句代码。
 public static EventBus getDefault() {
        if (defaultInstance == null) {
            synchronized (EventBus.class) {
                if (defaultInstance == null) {
                    defaultInstance = new EventBus();
                }
            }
        }
        return defaultInstance
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值