EventBus一直在使用,对它的原理也大致明白,但是具体的细节却不清不楚的,有时候会想一个问题,让我自己写这么一个功能,能写出来吗??
使用方法就不赘述了,将从以下几点阐述对其的理解
1>总的逻辑
2>具体细节
3>优点与缺点
1.总的逻辑先从订阅开始吧
订阅流程插播一句:
之前刚开始使用eventbus,然后我在post 事件的类中对其进行了register与unregister,在接受该事件的地方没有加入这两个方法,当然,结果就是事件一直没有得到响应,当时我还很困惑,问了封装这个类的同事,他也不知道为什么,现在有没有觉得我碰到的这个问题很可笑呢,哈哈哈哈哈
EventBus.getDefault().register(this);
上面那张图就是对这行代码背后逻辑的大体解释了..
细节分析
1>EventBus.getDefault()
单例实现想具体了解单例模式的请移驾https://www.cnblogs.com/zhaoyan001/p/6365064.html
问题1:看到这里实际我是有疑问的,难道创建一个eventbus实例没有需要调用者传入的参数吗?或者我想自定义eventbus呢?
eventbus构造函数 EventBusBuilder具体实现解答:构造函数传入的EventBusBuilder的实例,builder中是对eventbus初始化数据的一些默认配置,当我想自定义一些配置数据的时候,可以获取builder,然后更改配置,之后调用installDefaultEventBus方法获取到EventBus实例
总结:对我而言,这是细节中的亮点,感觉幼稚的大神,请自行略过(^_^)
eg:
小提示:
建议通过installDefaultEventBus获取到eventbus实例,因为是与单例绑定的,自己如果直接new一个,一般很容易出现一些奇奇怪怪的问题
2>接下来就是register了
register细节:ignoreGeneratedIndex
通过使用APT/EventBus annotation processor(EventBus注解处理器),订阅者索引在编译期间就会被创建,注意只有用@Subscriber注解的方法才能被编入索引到,同时subscriber类和事件类必须是public。并且,由于Java注解处理本身的技术限制,@Subscribe 注解不能使用在匿名类中。当EventBus不能使用索引,它将自动恢复到在运行时通过反射的方式,因此它也能正常工作,只是变得更慢了
问题2:
项目中用的是eventBus jar包,我就把它拷到demo工程中了,然后我参考网上Android注解使用之注解编译android-apt如何切换到annotationProcessor - 总李写代码 - 博客园的步骤,生成索引,一直无法生成,对自己的智商....jar包比较老了
3>既然默认为false,那接下来就是findUsingInfo方法了
findUsingInfo方法 prepareFindState1.点评:这样设计是不是很赞呢!
问题:FIND_STATE_POOL[i] =null;这里设置为null,那么当FindState池里的实例都为null了,这个设计的初衷在哪里呢??
解答:getMethodsAndRelease方法中就重新给FindState池的实例赋值了
2.具体的业务逻辑就不赘述了,对findUsingReflectionInSingleClass一些比较好的细节点说一下,值得开发者借鉴
1>getMethods与getDeclaredMethods的区别
2>if ((modifiers & Modifier.PUBLIC) !=0 && (modifiers &MODIFIERS_IGNORE) ==0)
这样的判断是不是很赞呢!!!
3>看代码的时候一直对FindState不理解,特此标注一下
2.发送事件的流程
post流程1>问题:eventbus支持跨进程吗?
解答:不支持,实际当看到它是单例模式获取到的实例,实际就能得到答案了,仅支持多线程
2>这个过程没有做过多赘述,但是建议看看源码,里面各处的 synchronized 关键字以及标志位的使用有很多值得借鉴的地方
3.优缺点
优点:调用很简单,解耦了
缺点:
1.大量的滥用,逻辑分散,出现问题后比较难定位(太过解耦了)
2.代码的可读性差
3.性能问题(虽然网上这么说,但是感觉微乎其微)
备注:还有一些采坑的点,可以看一下这篇文章
网友评论