您的位置:首页 > 移动开发 > Android开发

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存储生成的方法字符串
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: