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

2023-03-29 17:44:20 浏览数 (1)

文章目录

  • 一、EventBus 单例获取
  • 二、EventBus 构造函数
  • 三、EventBus 构建者

一、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);

0 人点赞