EventBus3.1.1大体流程梳理

本文详细梳理了 EventBus 3.1.1 的注册、发送事件和解绑流程。通过 `EventBus.getDefault().register(this)` 注册订阅者,`EventBus.getDefault().post(new MessageEvent())` 发布事件,以及 `EventBus.getDefault().unregister(this)` 解绑。关键数据结构包括 `subscriptionsByEventType` 和 `typesBySubscriber` 两个映射,分别存储事件类型与订阅方法和订阅者与其订阅事件的关系。在 `post()` 方法中,事件被加入队列,并通过 `postSingleEvent()` 分发给对应的订阅者执行消费方法。
摘要由CSDN通过智能技术生成

最近任务不多,想学习一下,于是就想到了看一下常年使用的EventBus源码,写篇日记本篇把eventbus的大体流聊解一下!以便记忆!

eventbus是一个Android事件发布/订阅轻量级框架,
功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。
eventbus3.1的源码!
现在最新的版本是3.1.1
studio 3.0以上的引用方式:implementation ‘org.greenrobot:eventbus:3.1.1’
eventbus的使用:
1> EventBus.getDefault().register(this) 在需要消费事件的activity或fragment注册!
2> EventBus.getDefault().post(new MessageEvent()) 事件的发送!
3>EventBus.getDefault().unregister(this) 解除绑定!
这里的this,是指当前所在的类的引用!如果不解除注册,那么eventbus会一直持有这个类,(activity,或者fragment)造成不必要的内存支出,当然有绑定就需要解除绑定,eventbus不解除注册的话,会抛出异常!

首先从入口看 EventBus.getDefault().register(this) 注册方法里,做了什么

 public static EventBus getDefault() { 
    EventBus instance = defaultInstance;
    if (instance == null) {   //看到这里是不是有种熟悉的感觉,这里用到了在众多源码种都会使用的java的一个双重校验锁,只有在第一次调用才会去持有锁!避免不必要的性能消耗!                   
        synchronized (EventBus.class) {
            instance = EventBus.defaultInstance;
            if (instance == null) {
                instance = EventBus.defaultInstance = new EventBus();
            }
        }
    }
    return instance;
}

先看getDefault()实例化一个单利对象!
static volatile EventBus defaultInstance; //这里 defaultInstance 用了关键字volatile 来修饰

接下来看new EventBus()中发生了什么

private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();    //这里实例化了一个EventBusBuilder对象
public EventBus() { 
    this(DEFAULT_BUILDER);//调用了下面的构造方法
}

EventBus(EventBusBuilder builder) {     //初始化了一些变量,往下看这些都是干嘛的!
    logger = builder.getLogger();
    subscriptionsByEventType = new HashMap<>();
    typesBySubscriber = new HashMap<>();
    stickyEvents = new ConcurrentHashMap<>();
    mainThreadSupport = builder.getMainThreadSupport();
    mainThreadPoster = mainThreadSupport != null ? mainThreadSupport.createPoster(this) : null;
    backgroundPoster = new BackgroundPoster(this);
    asyncPoster = new AsyncPoster(this);
    indexCount = builder.subscriberInfoIndexes != null ? builder.subscriberInfoIndexes.size() : 0;
    subscriberMethodFinder = new SubscriberMethodFinder(builder.subscriberInfoIndexes,
            builder.strictMethodVerification, builder.ignoreGeneratedIndex);
    logSubscriberExceptions = builder.logSubscriberExceptions;
    logNoSubscriberMe
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值