if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
// 调用带参数的构造方法
public EventBus() {
this(DEFAULT_BUILDER);
}
//
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;
}
在EventBus(builder)构造方法里初始化了一些配置信息。
之后调用了EventBus的register(obj)方法,这个方法接收的参数类型是Object。这里我们分步骤1和步骤2去看看做了哪些操作。
public void register(Object subscriber) {
// 通过反射拿到传入的obj的Class对象,如果是在MainActivity里做的注册操作,
// 那subscriber就是MainActivity对象
Class<?> subscriberClass = subscriber.getClass();
// 步骤1
List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
// 步骤2
synchronized (this) {
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod);
}
}
}
步骤1
List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
首先subscriberMethodFinder
对象是在EventBus带参数的构造函数里进行初始化的,从这个findSubscriberMethods()
方法名就可以看出来,步骤1的是去获取当前注册的对象里所有的被@Subscribe
注解的方法集合,那这个List集合的对象SubscriberMethod
又是什么东东呢? 我们去看一下
/** Used internally by EventBus and generated subscriber indexes. */
public class SubscriberMethod {
final Method method;
final ThreadMode threadMode;
final Class<?> eventType;
final int priority;
final boolean sticky;
/** Used for efficient comparison */
String methodString;
public SubscriberMethod(Method method, Class<?> eventType, ThreadMode threadMode, int priority, boolean sticky) {
this.method = method;
this.threadMode = threadMode;
this.eventType = eventType;
this.priority = priority;
this.sticky = sticky;
}
…
}
看完这个类里定义的信息,大概明白了。SubscriberMethod 定义了Method方法名,ThreadMode 线程模型,eventType 事件的class对象,priority是指接收事件的优先级,sticky是指是否是粘性事件,SubscriberMethod 对这些信息做了一个封装。这些信息在我们处理事件的时候都会用到。
好的,知道了SubscriberMethod 是什么东东后,我们直接进入findSubscriberMethods(subscriberClass)
方法:
List findSubscriberMethods(Class<?> subscriberClass) {
// METHOD_CACHE是事先定义了一个缓存Map,以当前的注册对象的Class对象为key,注册的对象里所有的被@Subscribe注解的方法集合为value
List subscriberMethods = METHOD_CACHE.get(subscriberClass);
// 第一次进来的时候,缓存里面没有集合,subscriberMethods 为null
if (subscriberMethods != null) {
return subscriberMethods;
}
// ignoreGeneratedIndex是在SubscriberMethodFinder()的构造函数初始化的,默认值是 false
if (ignoreGeneratedIndex) {
// 通过反射去获取
subscriberMethods = findUsingReflection(subscriberClass);
} else {
// 通过apt插件生成的代码。使用subscriber Index生成的SubscriberInfo来获取订阅者的事件处理函数,
subscriberMethods = findUsingInfo(subscriberClass);
}
if (subscriberMethods.isEmpty()) {
throw new EventBusException("Subscriber " + subscribe