Android 组件通讯库EventBus源码分析
2015-05-25 13:27
253 查看
很早之前就开通了csdn,一直想写点博客可是怎么说呢,感觉一直没有时间(其实就是比较懒)。最近稍微空闲点了,趁中午写个第一篇,希望以后能多写点,多记录点。
言归正传,最近有一个组件通讯库eventbus 很火,号称轻量级,更快,代码更优雅,可以一定程度上取代broadcast。github 地址:https://github.com/greenrobot/EventBus.git。既然如此,我就简单看了下其源代码,不得不说还是很有学习价值的,有时候对设计和架构的理解还得多看看源代码。
使用方法的话,网上很多也很简单,就是需要用到的时候EventBus.getDefault().register(this);就好了,销毁的时候EventBus.getDefault().unregister(this); 感觉跟broadcast有点相似。注册的组件必须有一个OnEvent方法,调用的时候EventBus.getDefault().post();就可以了。当然该组件支持灵活的线程调用方式,通过onevent方法的名称来区别。具体的使用方法可以百度的。
下面看看源码,涉及多线程,所以阅读这个源码对多线程编程的水平
首先看下 register 方法。
private synchronized void register(Object subscriber, boolean sticky, int priority) {
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod, sticky, priority);
}
}
首先,SubscriberMethod 类里面有定义了Method(根据反射获得的方法),ThreadMode(线程类型的枚举),hashcode也是method的hashcode,从某种意义上来说就是对注册后的组件中的方法进行一个解析后的一个数据模型。解析的方法就是subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
SubscriberMethodFinder 类中有个static的Map存储着所有以前找过的方法,避免重复查找,毕竟查找的时候是通过反射,反射的效率是比较低的,虽然已经有所优化,但是遍历所有方法所带来的效率损失还不如使用hashmap来做缓存好,key就是传进来的class name,由于hashmap不是线程安全,所以加个同步。
接下去是对方法的解析,for循环遍历所有方法,用hashset存储生成的方法字符串
言归正传,最近有一个组件通讯库eventbus 很火,号称轻量级,更快,代码更优雅,可以一定程度上取代broadcast。github 地址:https://github.com/greenrobot/EventBus.git。既然如此,我就简单看了下其源代码,不得不说还是很有学习价值的,有时候对设计和架构的理解还得多看看源代码。
使用方法的话,网上很多也很简单,就是需要用到的时候EventBus.getDefault().register(this);就好了,销毁的时候EventBus.getDefault().unregister(this); 感觉跟broadcast有点相似。注册的组件必须有一个OnEvent方法,调用的时候EventBus.getDefault().post();就可以了。当然该组件支持灵活的线程调用方式,通过onevent方法的名称来区别。具体的使用方法可以百度的。
下面看看源码,涉及多线程,所以阅读这个源码对多线程编程的水平
首先看下 register 方法。
private synchronized void register(Object subscriber, boolean sticky, int priority) {
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod, sticky, priority);
}
}
首先,SubscriberMethod 类里面有定义了Method(根据反射获得的方法),ThreadMode(线程类型的枚举),hashcode也是method的hashcode,从某种意义上来说就是对注册后的组件中的方法进行一个解析后的一个数据模型。解析的方法就是subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
SubscriberMethodFinder 类中有个static的Map存储着所有以前找过的方法,避免重复查找,毕竟查找的时候是通过反射,反射的效率是比较低的,虽然已经有所优化,但是遍历所有方法所带来的效率损失还不如使用hashmap来做缓存好,key就是传进来的class name,由于hashmap不是线程安全,所以加个同步。
接下去是对方法的解析,for循环遍历所有方法,用hashset存储生成的方法字符串
相关文章推荐
- Android四大组件Service启动源码分析
- android系统源码分析--Activity Launcher组件启动过程
- Android源码解析四大组件系列(一)---Service的启动过程分析
- Android开发周报:Android M、iOS9比拼、多种组件源码分析
- Android四大组件Activity启动源码分析
- Android 从源码分析Bitmap和BitmapFactory常用API
- android WifiDisplay 源码分析系列 (一)
- Android InputMethod 源码分析,显示输入法流程
- SpringMVC源码分析(5)剖析重要组件HandlerMapping 推荐
- 从Android源码分析View绘制
- (转)android的消息处理机制(图+源码分析)——Looper,Handler,Message
- smack 源码分析- PacketWriter (android上实现长连接)
- Android源码设计模式分析一期发布
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android 4.0 Launcher2源码分析——Launcher内容加载详细过程
- Android解耦库EventBus的使用和源码分析
- Android深入源码分析理解Aidl整体调用流程(雷惊风)
- Android 5.0源码解析 ---Activity源码分析
- android ActivityManagerService 源码分析----Activity管理(二)