前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【EventBus】EventBus 源码解析 ( EventBus 构建 | EventBus 单例获取 | EventBus 构造函数 | EventBus 构建者 )

【EventBus】EventBus 源码解析 ( EventBus 构建 | EventBus 单例获取 | EventBus 构造函数 | EventBus 构建者 )

作者头像
韩曙亮
发布2023-03-29 17:44:20
6490
发布2023-03-29 17:44:20
举报

文章目录

一、EventBus 单例获取


在 EventBus 中 , 不论是进行注册 , 取消注册 , 还是发送信息 , 都需要调用 EventBus.getDefault() , 获取一个 EventBus 的实例对象 , 这个实例对象是 单例对象 ;

EventBus.getDefault() 方法中 , 校验了

2

instance == null , 第一次校验先判空 , 然后加锁后再次进行第

2

次校验 , 这是为了预防在第

1

次校验后 , 在创建 EventBus 前 , 突然在其它线程中创建了 EventBus 并且注册了订阅者 , 新创建的 EventBus 实例对象肯定会覆盖旧的 EventBus , 但是旧的 EventBus 中的订阅者就彻底消失了 ;

双重加锁校验 可以保证 EventBus 实例对象 全局 全时间线 唯一 ;

代码语言:javascript
复制
/**
 * EventBus是Java和Android的中央发布/订阅事件系统。
 * 事件被发布({@link#post(Object)})到总线,总线将其传递给具有匹配处理程序的订阅者
 * 事件类型的方法。
 * 要接收事件,订阅者必须使用{@link#register(Object)}将自己注册到总线。
 * 一旦注册,订阅服务器将接收事件,直到调用{@link#unregister(Object)}。
 * 事件处理方法必须由{@link Subscribe}注释,必须是公共的,不返回任何内容(void),
 * 并且只有一个参数(事件)。
 */
public class EventBus {
    /** Convenience singleton for apps using a process-wide EventBus instance. */
    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.getDefault() 方法中 , 调用了 new EventBus() 方法创建了 EventBus 实例对象 , 在构造函数中 , 又调用了 EventBus(EventBusBuilder builder) 构造函数 , 传入默认的 构建者 EventBusBuilder 实例对象 ;

EventBus(EventBusBuilder builder) 构造函数中 , 初始化了一堆数据 ;

代码语言:javascript
复制
/**
 * EventBus是Java和Android的中央发布/订阅事件系统。
 * 事件被发布({@link#post(Object)})到总线,总线将其传递给具有匹配处理程序的订阅者
 * 事件类型的方法。
 * 要接收事件,订阅者必须使用{@link#register(Object)}将自己注册到总线。
 * 一旦注册,订阅服务器将接收事件,直到调用{@link#unregister(Object)}。
 * 事件处理方法必须由{@link Subscribe}注释,必须是公共的,不返回任何内容(void),
 * 并且只有一个参数(事件)。
 */
public class EventBus {

    private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
    
    /**
     * 创建一个新的EventBus实例;每个实例都是一个单独的作用域,在其中传递事件。要使用中央总线,请考虑{@link#getDefault()}。
     */
    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;
        logNoSubscriberMessages = builder.logNoSubscriberMessages;
        sendSubscriberExceptionEvent = builder.sendSubscriberExceptionEvent;
        sendNoSubscriberEvent = builder.sendNoSubscriberEvent;
        throwSubscriberException = builder.throwSubscriberException;
        eventInheritance = builder.eventInheritance;
        executorService = builder.executorService;
    }
}

三、EventBus 构建者


EventBusBuilder 构建者中 , 有很多属性值 , 其中可以进行很多配置 ;

代码语言:javascript
复制
/**
 * 使用自定义参数创建EventBus实例,还允许安装自定义默认EventBus实例。使用{@link EventBus#builder()}创建一个新的生成器。
 */
@SuppressWarnings("unused")
public class EventBusBuilder {
    private final static ExecutorService DEFAULT_EXECUTOR_SERVICE = Executors.newCachedThreadPool();

    boolean logSubscriberExceptions = true;
    boolean logNoSubscriberMessages = true;
    boolean sendSubscriberExceptionEvent = true;
    boolean sendNoSubscriberEvent = true;
    boolean throwSubscriberException;
    boolean eventInheritance = true;
    boolean ignoreGeneratedIndex;
    boolean strictMethodVerification;
    ExecutorService executorService = DEFAULT_EXECUTOR_SERVICE;
    List<Class<?>> skipMethodVerificationForClasses;
    List<SubscriberInfoIndex> subscriberInfoIndexes;
    Logger logger;
    MainThreadSupport mainThreadSupport;
}

用户可以自己配置 EventBusBuilder 构建者 , 创建个性化的 EventBus , 并注册订阅者 ;

代码语言:javascript
复制
        EventBus.builder().eventInheritance(false)
                .sendNoSubscriberEvent(false)
                .ignoreGeneratedIndex(false)
                .logSubscriberExceptions(false)
                .throwSubscriberException(false)
                .build().register(this);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、EventBus 单例获取
  • 二、EventBus 构造函数
  • 三、EventBus 构建者
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档