文章目录
一、EventBus 单例获取
二、EventBus 构造函数
三、EventBus 构建者
一、EventBus 单例获取
在 EventBus 中 , 不论是进行注册 , 取消注册 , 还是发送信息 , 都需要调用 EventBus.getDefault() , 获取一个 EventBus 的实例对象 , 这个实例对象是 单例对象 ;
在 EventBus.getDefault() 方法中 , 校验了 2 22 次 instance == null , 第一次校验先判空 , 然后加锁后再次进行第 2 22 次校验 , 这是为了预防在第 1 11 次校验后 , 在创建 EventBus 前 , 突然在其它线程中创建了 EventBus 并且注册了订阅者 , 新创建的 EventBus 实例对象肯定会覆盖旧的 EventBus , 但是旧的 EventBus 中的订阅者就彻底消失了 ;
双重加锁校验 可以保证 EventBus 实例对象 全局 全时间线 唯一 ;
/** * 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) 构造函数中 , 初始化了一堆数据 ;
/** * 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 构建者中 , 有很多属性值 , 其中可以进行很多配置 ;
/** * 使用自定义参数创建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 , 并注册订阅者 ;
EventBus.builder().eventInheritance(false) .sendNoSubscriberEvent(false) .ignoreGeneratedIndex(false) .logSubscriberExceptions(false) .throwSubscriberException(false) .build().register(this);