一、源码解析
(1)EventBus.getDefault()获取EventBus对象
- 调用EventBus的静态getDefault()方法返回一个EventBus对象,采用单例实现。
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;
}
// 调用带参数的构造方法
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;
}
(2)register(this)注册订阅者
- SubscriberMethod对象存储Subscribe注解信息
public void register(Object subscriber) {
//通过反射拿到传入subscriber的Class对象。
Class> subscriberClass = subscriber.getClass();
//获取当前注册的对象里所有的被@Subscribe注解的方法集合
List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
synchronized (this) {
//注册订阅者
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod);
}
}
}
- subscriberMethodFinder.findSubscriberMethods(subscriberClass)
//SubscriberMethodFinder.java
List findSubscriberMethods(Class> subscriberClass) {
//从METHOD_CACHE缓存中获取订阅者方法
List subscriberMethods = METHOD_CACHE.get(subscriberClass);
//如果获取到了订阅者方法直接返回。
if (subscriberMethods != null) {
return subscriberMethods;
}
//是否忽略生成的订阅者索引,默认为false
if (ignoreGeneratedIndex) {
subscriberMethods = findUsingReflection(subscriberClass);
} else {
subscriberMethods = findUsingInfo(subscriberClass);
}
//判断集合是否为空
if (subscriberMethods.isEmpty()) {
throw new EventBusException("Subscriber " + subscriberClass
+ " and its super classes have no public methods with the @Subscribe annotation");
} else {
//更新METHOD_CACHE缓存,然后再返回
METHOD_CACHE.put(subscriberClass, subscriberMethods);
return subscriberMethods;
}
}
//查找订阅者方法
private List findUsingInfo(Class> subscriberClass) {
FindState findState = prepareFindState();
findState.initForSubscriber(subscriberClass);
//查找订阅者的订阅者方法,而且查找了订阅者父类的订阅者方法
while (findState.clazz != null) {
//步骤一
findState.subscriberInfo = getSubscriberInfo(findState);
//是否获取到订阅者信息
if (findState.subscriberInfo != null) {
//获取订阅者信息的订阅者方法
SubscriberMethod[] array = findState.subscriberInfo.getSubscriberMethods();
//循环遍历保存订阅者方法
for (SubscriberMethod subscriberMethod : array) {
if (findState.checkAdd(subscriberMethod.method, subscriberMethod.eventType)) {
findState.subscriberMethods.add(subscriberMethod);
}
}
} else {
//步骤二
findUsingReflectionInSingleClass(findState);
}
findState.moveToSuperclass();
}
return getMethodsAndRelease(findState);
}
//步骤一通过订阅者索引查找订阅者信息
private SubscriberInfo getSubscriberInfo(FindState findState) {
//code...
//判断是否添加订阅者索引
if (subscriberInfoIndexes != null) {
//将遍历subscriberInfoIndexes成员变量来查找订阅者信息
for (SubscriberInfoIndex index : subscriberInfoIndexes) {
SubscriberInfo info = index.getSubscriberInfo(findState.clazz);
if (info != null) {
return info;
}
}
}
return null;
}
//步骤二通过Java反射查找订阅者方法
private void findUsingReflectionInSingleClass(FindState findState) {
Method[] methods;
try {
//查询注册对象的所有方法
methods = findState.clazz.getDeclaredMethods();
} catch (Throwable th) {
try {
methods = findState.clazz.getMethods();
} catch (LinkageError error) {
//code...
}
findState.skipSuperClasses = true;
}
//遍历循环满足条件的方法
//public访问权限、非static方法、非abstract方法、有且只有一个参数和使用了@Subscribe注解
for (Method method : methods) {
int modifiers = method.getModifiers();
if ((modifiers & Modifier.PUBLIC) != 0 && (modifiers & MODIFIERS_IGNORE) == 0) {
Class>[] parameterTypes = method.getParameterTypes();
if (parameterTypes.length == 1) {
Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class);
if (subscribeAnnotation != null) {
Class> eventType = parameterTypes[0];
if (findState.checkAdd(method, eventType)) {
ThreadMode threadMode = subscribeAnnotation.threadMode();
findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode,
subscribeAnnotation.priority(), subscribeAnnotation.sticky()));
}
}
} else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) {
String methodName = method.getDeclaringClass().getName() + "." + method.getName();
throw new EventBusException("@Subscribe method " + methodName +
"must have exactly 1 parameter but has " + parameterTypes.length);
}
} else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) {
String methodName = method.getDeclaringClass().getName() + "." + method.getName();
throw new EventBusException(methodName +
" is a illegal @Subscribe method: must be public, non-static, and non-abstract");
}
}
}
- subscribe(subscriber, subscriberMethod)
将该订阅者方法对应的事件类型添加到对应订阅者的订阅事件类型列表中
private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {
//拿到事件event类型
Class> eventType = subscriberMethod.eventType;
//创建包含订阅者方法和订阅者对象
Subscription newSubscription = new Subscription(subscriber, subscriberMethod);
//subscriptionsByEventType是一个Map集合,key是事件类型。
CopyOnWriteArrayList subscriptions = subscriptionsByEventType.get(eventType);
//判断subscriptions是否为null
if (subscriptions == null) {
//创建CopyOnWriteArrayList对象,并且往Map集合中添加
subscriptions = new CopyOnWriteArrayList<>();
subscriptionsByEventType.put(eventType, subscriptions);
} else {
//判断是否发生重复注册
if (subscriptions.contains(newSubscription)) {
throw new EventBusException("Subscriber " + subscriber.getClass() + " already registered to event "
+ eventType);
}
}
//通过优先级添加订阅者方法
int size = subscriptions.size();
for (int i = 0; i <= size; i++) {
if (i == size || subscriberMethod.priority > subscriptions.get(i).subscriberMethod.priority) {
subscriptions.add(i, newSubscription);
break;
}
}
List> subscribedEvents = typesBySubscriber.get(subscriber);
if (subscribedEvents == null) {
subscribedEvents = new ArrayList<>();
typesBySubscriber.put(subscriber, subscribedEvents);
}
subscribedEvents.add(eventType);
//处理粘性事件
if (subscriberMethod.sticky) {
if (eventInheritance) {
Set, Object>> entries = stickyEvents.entrySet();
for (Map.Entry, Object> entry : entries) {
Class> candidateEventType = entry.getKey();
if (eventType.isAssignableFrom(candidateEventType)) {
Object stickyEvent = entry.getValue();
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
}
}
} else {
Object stickyEvent = stickyEvents.get(eventType);
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
}
}
}
(3)unregister(this)注销订阅者
public synchronized void unregister(Object subscriber) {
//获取该订阅者订阅的所有事件类型列表
List> subscribedTypes = typesBySubscriber.get(subscriber);
if (subscribedTypes != null) {
//遍历事件类型列表对每个事件类型调用unsubscribeByEventType()方法
for (Class> eventType : subscribedTypes) {
unsubscribeByEventType(subscriber, eventType);
}
//删除成员变量中订阅者订阅的事件类型列表。
typesBySubscriber.remove(subscriber);
} else {
logger.log(Level.WARNING, "Subscriber to unregister was not registered before: " + subscriber.getClass());
}
}
private void unsubscribeByEventType(Object subscriber, Class> eventType) {
//获取事件类型列表
List subscriptions = subscriptionsByEventType.get(eventType);
if (subscriptions != null) {
int size = subscriptions.size();
for (int i = 0; i < size; i++) {
//获取该事件的订阅者
Subscription subscription = subscriptions.get(i);
//判断订阅者是否相同
if (subscription.subscriber == subscriber) {
subscription.active = false;
//删除订阅者事件
subscriptions.remove(i);
i--;
size--;
}
}
}
}
(4)EventBus.getDefault().post(message)发送事件
public void post(Object event) {
PostingThreadState postingState = currentPostingThreadState.get();
List