通常,我们会通过getDefault()来获取EventBus的实例。
EventBus.getDefault()
我们来查看他内部的实现。
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
可以看到,这是个双重校验锁的单例模式,说明通过getDefault()
获取的EventBus对象是个单实例。
这里再来看下EventBus的构造方法
EventBus(EventBusBuilder builder) {
subscriptionsByEventType = new HashMap<>();
typesBySubscriber = new HashMap<>();
stickyEvents = new ConcurrentHashMap<>();
mainThreadPoster = new HandlerPoster(this, Looper.getMainLooper(), 10);
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;
}
这里参数传入了EventBusBuilder对象,很明显,构造方法中会根据EventBusBuilder进行一些变量的初始化。根据Builder这个命名,我们可以猜想到这是个建造者模式。
如果我们需要自定义EventBus,完全可以使用建造者模式构建一个。不过,一般情况下,使用getDefault()
完全就足够使用了。
EventBus eventBus = EventBus.builder()
.eventInheritance(false)
.sendNoSubscriberEvent(true)
.skipMethodVerificationFor(MainActivity.class)
.build();
至此,EventBus的实例获取就分析完了,下一篇文章,我们将来分析下EventBus的订阅过程。