前言:
EventBus定义:是一个发布 / 订阅的事件总线。
这么说应该包含4个成分:发布者,订阅者,事件,总线。
那么这四者的关系是什么呢?
很明显:订阅者订阅事件到总线,发送者发布事件。
主要用于进程内部组件之间的通信。
EventBus是一个单例模式,在一个进程中只有一个对象, getDefault方法如下,
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
使用了双重判断的方式,防止并发的问题,极大的提高了效率。
1,事件注册
调用register方法注册事件, EventBus的register方法如下,
public void register(Object subscriber) {
Class<?> subscriberClass = subscriber.getClass();
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
synchronized (this) {
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod);
}
}
}
获取订阅者的类对象,因为订阅者不是特定类的对象,因此使用Object表示。
1.1 findSubscriberMethods
首先看看SubscriberMethod类的作用,
public class SubscriberMethod {
final Method method;//方法
final ThreadMode threadMode;//执行线程
final Class<?> eventType;//接收的事件类型
final int priority;//优先级
final boolean sticky;
/** Used for efficient comparison */
String methodString;
....
}
SubscriberMethod其实就是一个订阅方法的实体类,里面保存了订阅方法信息.
每一个事件订阅类都对应一个SubscriberMethod list。
首先看subscriberMethodFinder.findSubscriberMethods,
该方法的作用其实就是从订阅类中获取所有的订阅方法信息,主要逻辑如下,
1,从METHOD_CACHE MAP中读取对应的SubscriberMethod list,
List<SubscriberMethod> subscriberMethods = METHOD_CACHE.get(subscriberClass);
if (subscriberMethods != null) {
return subscriberMethods;
}
2, 利用反射来获取订阅类中的订阅方法信息
if (ignoreGeneratedIndex) {
//利用反射来获取订阅类中的订阅方法信息
subscriberMethods = findUsingReflection(subscriberClass);
} else {
//从注解器生成的MyEventBusIndex类中获得订阅类的订阅方法信息
subscriberMethods = findUsingInfo(subscriberClass);
}
3,在METHOD_CACHE中保存SubscriberMethod