目前项目里用到了较多的eventbus来传递,接收收据,所以今天就花了点时间整理了一下eventbus执行流程
本文主要分析eventbus 里的几个比较重要方法
1 ,eventbus.getdefault
获取一个单例对象
2,eventbus.getdefault.register()
//获取当前注册的类
Class subscriberClass = subscriber.getClass();
获取我们在当前类定义的接收eventbus方法列表
List subscriberMethods =subscriberMethodFinder.findSubscriberMethods(subscriberClass);
这个方法具体实现
首先 METHOD_CACHE是一个 hashmap ,它里面缓存了我们已经注册过的的类定义的接收方法列表,避免重复获取
第一次进来则会获取我们定义的接收事件方法列表
这个方法首先是创建一个新的FindState类,通过两种方法获取,一种是从FIND_STATE_POOL即FindState池中取出可用的FindState,如果没有的话,则通过第二种方式:直接new一个新的FindState对象。FindState类是SubscriberMethodFinder的内部类,这个方法主要做一个初始化的工作。这里由于初始化的时候,findState.subscriberInfo和subscriberInfoIndexes为空,所以这里会调用findUsingReflectionInSingleClass(findState);
方法,这个方法最终会获取到我们定义接收消息类的方法列表(主要代码)
// This is faster than getMethods, especially when subscribers are fat classes like Activities
,反射获取们当前注册类的自己声明的方法列表
methods = findState.clazz.getDeclaredMethods();
//遍历方法列表
for (Method method : methods) {
int modifiers = method.getModifiers();
if ((modifiers & Modifier.PUBLIC) !=0 && (modifiers &MODIFIERS_IGNORE) ==0) {
//获取当前方法的参数列表
Class[] parameterTypes = method.getParameterTypes();
//这里判断等于1 说明我们定义的接收方法的参数只能有1个
if (parameterTypes.length ==1) {
//获取当前方法是否有@subscribe 注解
Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class);
if (subscribeAnnotation !=null) {
eventType = parameterTypes[0];
if (findState.checkAdd(method, eventType)) {
ThreadMode threadMode = subscribeAnnotation.threadMode();
//获取方法的threadmode等属性,并创建一个SubscriberMethod 添加ArrayList中
findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode,
subscribeAnnotation.priority(), subscribeAnnotation.sticky()));
}
}
...
}
好了,我们定义的接收方法列表获取到了,在看register接下来的逻辑
遍历刚刚获取的方法列表,调用subscribe方法,这是subscribe方法前半段
这段代码主要是 以方法参数的类型class为key,以list
下面的typesBySubscriber也是一个hashmap ,它是以当前类为key,以方法参数的类型class为value,这个hashmap主要是判断当前event是否注册
这个是subscribe方法后半部分,主要针对的是stickyevent,我们看到后面会调用checkPostStickyEventToSubscription(newSubscription, stickyEvent);这个方法,而这个方法最终会调用下面这个方法
这里说明我们在发送stickyevent的时候,相应的sticky方法会在当前类的eventbus注册的时候调用
到这里eventbus注册就执行完了
3 eventbus.getdefault.post() eventbus发送消息
post方法会调用 postSingleEvent(eventQueue.remove(0), postingState); 方法,然后再调用 postSingleEventForEventType(event, postingState, eventClass);方法,再看这个方法
首先这个subscriptionsByEventType(hashmap)是刚刚注册的时候保存的方法列表,获取到我们要发送的event之后会调用postToSubscription(subscription, event, postingState.isMainThread);方法,这个方法就是去执行subscription里的method.
自此,eventbus基本执行流程也就结束了