自己没有怎么花时间画图,怕可能有遗漏的地方 所以,先参考一下别人的代码分析 (之前的内容,应该没有雷同的地方,参考别人的分析,也是自我提高的过程) 我们先看一下下面的图: (来自 Trinea的分析: http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90)
(这个图,虽然没有说明,但是我们通过例如 SubscriberMethodFinder的属性 还有图:)
应该可以判断这个分析, 也就是 上图是2.x的版本,3.0和它还是有区别的, 我们暂时使用而已
我们再贴一下对应2.4和3.0的类
EventBus2.4
EventBus3.0
类名上看,除了一个 我们分析过的 @interface Subscribe 注解类以外,其他类都是一致的 (当然,我们简单看过SubscriberMethodFinder 类, 里面的实现 区别还是挺大的, 2.x的很好理解, 3.0的相对2.x,要复杂很多)
来自 Trinea的上图,简单结构说明 (只是结构,因为3.0 和 2.x 部分类的实现还是有很大区别的) 我们结构按上图分析, 具体源码,根据实际情况,再做了解
从上图,我们可以知道,EventBus关联的类
其中
我们都大体分析过,剩下的,只有 **XxxxPoster 等类 **了
我们先看一下,对应的属性名称:
我们对应的代码,无论是怎么调用,最终都会到 postToSubscription方法
private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
switch (subscription.subscriberMethod.threadMode) {
case POSTING:
invokeSubscriber(subscription, event);
break;
case MAIN:
if (isMainThread) {
invokeSubscriber(subscription, event);
} else {
mainThreadPoster.enqueue(subscription, event);
}
break;
case BACKGROUND:
if (isMainThread) {
backgroundPoster.enqueue(subscription, event);
} else {
invokeSubscriber(subscription, event);
}
break;
case ASYNC:
asyncPoster.enqueue(subscription, event);
break;
default:
throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode);
}
}
我们前面分析注解的时候,知道 对应的ThreadMode通过@Subscribe注解传入的,如果不传,默认为ThreadMode.POSTING 上面大体有下面几种方式
而invokeSubscriber方法,大体就是调用 Subscription 中 SubscriberMethod的Method反射, 从而调用对应register类中的方法
void invokeSubscriber(Subscription subscription, Object event) {
try {
subscription.subscriberMethod.method.invoke(subscription.subscriber, event);
} catch (InvocationTargetException e) {
handleSubscriberException(subscription, event, e.getCause());
} catch (IllegalAccessException e) {
throw new IllegalStateException("Unexpected exception", e);
}
}
其他的3个xxxPoster的enqueue(subscription, event) 方法 就是调用封装类对应的enqueue(subscription, event)方法 (个人感觉,这里都是调用相同的代码,写一个统一接口,可能会更方便一点) 这里
无论怎么样,最后,都会 EventBus的invokeSubscriber(pendingPost)去反射调用方法
这里我们通过 Trinea 的类图,可以发现, 最终都是关联 PendingPostQueue 实现的, 而 PendingPostQueue 是关联 PendingPost 实现的
这里,虽然一些写法,自己还不太清楚为什么 只是简单理解和画一下自己的理解
或者说, 可以更简单的实现,
本来执行就是用线程池,为什么其他地方,还要写这么麻烦
但是,大体还是很好理解的,图中左边,右边都是注册的Subscribe (当然,细节还有很多地方不理解,大体画了个图,如果有问题的地方,欢迎大家拍砖,本人会第一时间做修改) 3种Poster提交
HandlerPoster提交
最后,再较大体的看一下调用过程 (因为比较简单,自己就不画了,借用 Trinea 大神 的图)
还有