一、EventBus 单例获取
在 EventBus 中 , 不论是进行注册 , 取消注册 , 还是发送信息 , 都需要调用 EventBus.getDefault()
, 获取一个 EventBus
的实例对象 , 这个实例对象是 单例对象 ;
在 EventBus.getDefault()
方法中 , 校验了
2
2
2 次 instance == null
, 第一次校验先判空 , 然后加锁后再次进行第
2
2
2 次校验 , 这是为了预防在第
1
1
1 次校验后 , 在创建 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);