【第四篇】androidEventbus源代码阅读和分析

简介: 1,分析androidEventbus的注册源代码: 我们在使用androidEventbus的第一步是注册eventbus,如下代码: EventBus.getDefault().register(this);   首先获取eventbus对象,采用单利模式实现获取对象: Eventbus.

1,分析androidEventbus的注册源代码:

我们在使用androidEventbus的第一步是注册eventbus,如下代码:
  1. EventBus.getDefault().register(this);

     

首先获取eventbus对象,采用单利模式实现获取对象:
Eventbus.java里面
  1. public static EventBus getDefault() {
            if (sDefaultBus == null) {
                synchronized (EventBus.class) {
                    if (sDefaultBus == null) {
                        sDefaultBus = new EventBus();
                    }
                }
            }
            return sDefaultBus;
        }

     


然后是:
  1. 1 public void register(Object subscriber) {
    2         if (subscriber == null) {
    3             return;
    4         }
    5         synchronized (this) {
    6             mMethodHunter.findSubcribeMethods(subscriber);
    7         }
    8     }

     


跟踪到 mMethodHunter . findSubcribeMethods ( subscriber );继续往下看:
mMethodHunter在代码头部注册:
  1. 1 /**
    2 * the subscriber method hunter, find all of the subscriber's methods
    3 * annotated with @Subcriber
    4 */
    5 SubsciberMethodHunter mMethodHunter =newSubsciberMethodHunter(mSubcriberMap);

     

用于查找所有使用@subcriber的注解方法
然后我们跟到 findSubcribeMethods ( subscriber )里面看看:
遍历
  1.  1 public void findSubcribeMethods(Object subscriber) {
     2         if (mSubcriberMap == null) {
     3             throw new NullPointerException("the mSubcriberMap is null. ");
     4         }
     5         Class<?> clazz = subscriber.getClass();
     6         // 查找类中符合要求的注册方法,直到Object类
     7         while (clazz != null && !isSystemCalss(clazz.getName())) {
     8             final Method[] allMethods = clazz.getDeclaredMethods();
     9             for (int i = 0; i < allMethods.length; i++) {
    10                 Method method = allMethods[i];
    11                 // 根据注解来解析函数
    12                 Subscriber annotation = method.getAnnotation(Subscriber.class);
    13                 if (annotation != null) {
    14                     // 获取方法参数
    15                     Class<?>[] paramsTypeClass = method.getParameterTypes();
    16                     // 订阅函数只支持一个参数
    17                     if (paramsTypeClass != null && paramsTypeClass.length == 1) {
    18                         Class<?> paramType = convertType(paramsTypeClass[0]);
    19                         EventType eventType = new EventType(paramType, annotation.tag());
    20                         TargetMethod subscribeMethod = new TargetMethod(method, eventType,
    21                                 annotation.mode());
    22                         subscibe(eventType, subscribeMethod, subscriber);
    23                     }
    24                 }
    25             } // end for
    26               // 获取父类,以继续查找父类中符合要求的方法
    27             clazz = clazz.getSuperclass();
    28         }
    29     }

     


然后再 subscibe(eventType, subscribeMethod, subscriber);方法里面的代码:
mSubcriberMap是个map集合
 
  1. /**
         * the event bus's subscriber's map
         */
        Map<EventType, CopyOnWriteArrayList<Subscription>> mSubcriberMap;
     1 /**
     2      * 按照EventType存储订阅者列表,这里的EventType就是事件类型,一个事件对应0到多个订阅者.
     3      * 
     4      * @param event 事件
     5      * @param method 订阅方法对象
     6      * @param subscriber 订阅者
     7      */
     8     private void subscibe(EventType event, TargetMethod method, Object subscriber) {
     9         CopyOnWriteArrayList<Subscription> subscriptionLists = mSubcriberMap.get(event);
    10         if (subscriptionLists == null) {
    11             subscriptionLists = new CopyOnWriteArrayList<Subscription>();
    12         }
    13         Subscription newSubscription = new Subscription(subscriber, method);
    14         if (subscriptionLists.contains(newSubscription)) {
    15             return;
    16         }
    17         subscriptionLists.add(newSubscription);
    18         // 将事件类型key和订阅者信息存储到map中
    19         mSubcriberMap.put(event, subscriptionLists);
    20     }

     

 
到这里就可以看到register就是遍历所有注解@Subcriber的方法,并将事件类型key和订阅者信息存储在map中去。这点很类似eventbus代码中register,只不过eventbus是以以onEvent开头的方法去进行查找,而androideventbus是以@subcriber去进行遍历检索,但最终都是将事件类型key和订阅者信息存储在map中去。
相关文章
|
3月前
|
人工智能 自然语言处理 供应链
面向企业的 ChatGPT 究极手册:第一章到第二章
面向企业的 ChatGPT 究极手册:第一章到第二章
92 0
面向企业的 ChatGPT 究极手册:第一章到第二章
|
6天前
|
安全 算法 测试技术
C#编程实战:项目案例分析
【4月更文挑战第20天】本文以电子商务系统为例,探讨C#在实际项目中的应用。通过面向对象编程实现组件抽象和封装,确保代码的可维护性和可扩展性;利用安全性特性保护用户数据;借助数据库操作处理商品信息;通过逻辑控制和算法处理订单;调试工具加速问题解决,展现C#的优势:面向对象、数据库交互、数据安全和开发效率。C#在实际编程中展现出广泛前景。
|
1月前
|
前端开发 测试技术 数据库
网上订餐系统的设计与实现(论文+源码)_kaic
网上订餐系统的设计与实现(论文+源码)_kaic
|
7月前
|
消息中间件 缓存 Java
五个月,秒杀,38个大的篇章,126+篇文章、视频、小册,150+源码分支,完美收官!
经过四个多月的坚持,《Seckill秒杀系统》终于接近尾声了,也感谢大家这四个多月以来的坚持和陪伴,也相信大家在《Seckill秒杀系统》专栏中,学到了不少知识和技术。接下来,我们就一起对《Seckill秒杀系统》专栏做个总结。
130 3
五个月,秒杀,38个大的篇章,126+篇文章、视频、小册,150+源码分支,完美收官!
|
3月前
|
存储 人工智能 安全
面向企业的 ChatGPT 究极手册:第七章到第八章
面向企业的 ChatGPT 究极手册:第七章到第八章
93 0
面向企业的 ChatGPT 究极手册:第七章到第八章
|
10月前
|
自然语言处理 前端开发 Java
网上投票系统的设计与实现(论文+源码)_kaic
随着全球Internet的迅猛发展和计算机应用的普及,特别是近几年无线网络的广阔覆盖以及无线终端设备的爆炸式增长,使得人们能够随时随地的访问网络,以获取最新信息、参与网络活动、和他人在线互动。为了能及时地了解民情民意,把握人们近期关注的内容,政府机构以及各大门户网站等单位会将一些热点话题以投票的形式发布到他们的网站上面,供人们在线投票。因此,网络在线投票系统应运而生。 本文在此情况下设计了一款网上线投票系统。首先,结合实际的应用开发情况,对该系统做了详细的需求分析。然后给出该系统的结构和各功能模块的分析,通过详细的结构和数据库表的设计,最终构建出一个基于Web的、以Struts2框架和MySQ
|
11月前
|
C++
c++第四篇
c++第四篇
|
11月前
|
C++
c++第七篇
c++第七篇
C#学习(第四篇)
在上篇文章中我们学习了C#变量、C#数据类型转换以及C#运算符,这次我将继续带着大家学习C#运算符优先级、C#常量、C# if else:条件判断语句和C# switch语句。
C#学习(第四篇)