init(初始化)
getDefault()
//volatile关键字在java并发编程中常用,比synchronized的开销成本要小,轻便
//作用是线程能访问共享变量
//共享变量包括所有的实例变量,静态变量和数组元素,他们都存放在堆内存中
static volatile EventBus defaultInstance;
//一个双重锁定的单例
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
//构造方法
public EventBus() {
this(DEFAULT_BUILDER);//默认构造器
}
//默认构造器的初始化
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
//初始化是一个空构造方法
EventBusBuilder() {
}
EventBus(EventBusBuilder)
//构造方法,里面会初始化一些基础变量。
//使用Builder设计模式,可以生成定制的EventBus单例,或者默认的EventBus单例。
EventBus(EventBusBuilder builder) {
logger = builder.getLogger();
//特定的订阅者与之对应的所有需要接收订阅它的方法map
subscriptionsByEventType = new HashMap<>();
//object对应的它之下的所有订阅者map
typesBySubscriber = new HashMap<>();
//粘性事件存储map
stickyEvents = new ConcurrentHashMap<>();
mainThreadSupport = builder.getMainThreadSupport();
//用于post非ui线程的订阅事件,切换到主线程,对应ThreadMode.Main
mainThreadPoster = mainThreadSupport != null ? mainThreadSupport.createPoster(this) : null;
//用于在后台线程发送订阅事件,对应ThreadMode.BACKGROUND
backgroundPoster = new BackgroundPoster(this);
//用于后台异步线程发送订阅事件,对应ThreadMode.ASYNC
asyncPoster = new AsyncPoster(this);
indexCount = builder.subscriberInfoIndexes != null ? builder.subscriberInfoIndexes.size() : 0;
//*订阅者方法查找类
subscriberMethodFinder = new SubscriberMethodFinder(builder.subscriberInfoIndexes,
builder.strictMethodVerification, builder.ignoreGeneratedIndex);//1
logSubscriberExceptions = builder.logSubscriberExceptions;
logNoSubscriberMessages = builder.logNoSubscriberMessages;
sendSubscriberExceptionEvent = builder.sendSubscriberExceptionEvent;
sendNoSubscriberEvent = builder.sendNoSubscriberEvent;
throwSubscriberException = builder.throwSubscriberException;
eventInheritance = builder.eventInheritance;
executorService = builder.executorService;
}
总结
eventbus的初始化工作大致为:
- 创建一个eventbus的单例
- 构造方法中初始化各种对象(重要的几个初始化对象)
- Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType
- 该map保存的是object的class对象下所有的标记了@Subscribe成为订阅者的Subscription对象
- Map<Object, List<Class<?>>> typesBySubscriber
- 该map保存的是Subscription的class对象下所有的接收的参数的class的集合
- 因为一个Subscription对象的方法名可能会重复,但是参数不能重复,eventbus靠的是方法的参数来区分,所以一个相同的方法名下会有很多种不同的参数,所以这里一个Subscription对应多个type的class对象
- mainThreadSupport
- 往主线程发送订阅消息的实现,类似于实现了Handler与Message再Looper中的消息传递
- mainThreadPoster
- 将需要发送的订阅消息加入到待发送队列,以便发送消息使用
- subscriberMethodFinder
- 查找Subscription对象下所有标记过的方法,用于发送消息。里面包含了一些方法
- List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
- 通过Subscription对象的class类找到当前Subscription对象所标记的所有SubscriberMethod对象,就相当与该方法记录了一个被标记了@Subscribe注解的方法集合
- List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
- 查找Subscription对象下所有标记过的方法,用于发送消息。里面包含了一些方法
- Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType