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.  public void register(Object subscriber) {
    if (subscriber == null) {
    return;
    }
    synchronized (this) {
    mMethodHunter.findSubcribeMethods(subscriber);
    }
    }


跟踪到mMethodHunter.findSubcribeMethods(subscriber);继续往下看:
mMethodHunter在代码头部注册:
  1.  /**
    * the subscriber method hunter, find all of the subscriber's methods
    * annotated with @Subcriber
    */
    SubsciberMethodHunter mMethodHunter =newSubsciberMethodHunter(mSubcriberMap);
用于查找所有使用@subcriber的注解方法
然后我们跟到findSubcribeMethods(subscriber)里面看看:
遍历
  1.  public void findSubcribeMethods(Object subscriber) {
    if (mSubcriberMap == null) {
    throw new NullPointerException("the mSubcriberMap is null. ");
    }
    Class<?> clazz = subscriber.getClass();
    // 查找类中符合要求的注册方法,直到Object类
    while (clazz != null && !isSystemCalss(clazz.getName())) {
    final Method[] allMethods = clazz.getDeclaredMethods();
    for (int i = 0; i < allMethods.length; i++) {
    Method method = allMethods[i];
    // 根据注解来解析函数
    Subscriber annotation = method.getAnnotation(Subscriber.class);
    if (annotation != null) {
    // 获取方法参数
    Class<?>[] paramsTypeClass = method.getParameterTypes();
    // 订阅函数只支持一个参数
    if (paramsTypeClass != null && paramsTypeClass.length == 1) {
    Class<?> paramType = convertType(paramsTypeClass[0]);
    EventType eventType = new EventType(paramType, annotation.tag());
    TargetMethod subscribeMethod = new TargetMethod(method, eventType,
    annotation.mode());
    subscibe(eventType, subscribeMethod, subscriber);
    }
    }
    } // end for
    // 获取父类,以继续查找父类中符合要求的方法
    clazz = clazz.getSuperclass();
    }
    }


然后再 subscibe(eventType, subscribeMethod, subscriber);方法里面的代码:
mSubcriberMap是个map集合
 
  1. /**
    * the event bus's subscriber's map
    */
    Map<EventType, CopyOnWriteArrayList<Subscription>> mSubcriberMap;

     /**
    * 按照EventType存储订阅者列表,这里的EventType就是事件类型,一个事件对应0到多个订阅者.
    *
    * @param event 事件
    * @param method 订阅方法对象
    * @param subscriber 订阅者
    */
    private void subscibe(EventType event, TargetMethod method, Object subscriber) {
    CopyOnWriteArrayList<Subscription> subscriptionLists = mSubcriberMap.get(event);
    if (subscriptionLists == null) {
    subscriptionLists = new CopyOnWriteArrayList<Subscription>();
    }
    Subscription newSubscription = new Subscription(subscriber, method);
    if (subscriptionLists.contains(newSubscription)) {
    return;
    }
    subscriptionLists.add(newSubscription);
    // 将事件类型key和订阅者信息存储到map中
    mSubcriberMap.put(event, subscriptionLists);
    }
 
到这里就可以看到register就是遍历所有注解@Subcriber的方法,并将事件类型key和订阅者信息存储在map中去。这点很类似eventbus代码中register,只不过eventbus是以以onEvent开头的方法去进行查找,而androideventbus是以@subcriber去进行遍历检索,但最终都是将事件类型key和订阅者信息存储在map中去。

【第四篇】androidEventbus源代码阅读和分析的更多相关文章

  1. 【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析

    代码里面发送粘性事件代码如下: // 发送Sticky事件 EventBus.getDefault().postSticky(new User("soyoungboy", &quo ...

  2. 【第五篇】androidEventbus源代码阅读和分析之unregister代码分析

    代码里面注销eventbus一般我们会在onDestory里面这么写: EventBus.getDefault().unregister(this); 然后走到unregister里面去看看: /** ...

  3. Tools - 源代码阅读分析工具Source Insight

    简介 https://www.sourceinsight.com/ Source Insight是一个面向项目开发的程序编辑器和代码浏览器,可以分析C/C++.C#.Java.Python等语言源代码 ...

  4. 非常好!!!Linux源代码阅读——中断【转】

    Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处 ...

  5. 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)

    本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...

  6. CI框架源代码阅读笔记5 基准測试 BenchMark.php

    上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的 ...

  7. [转]madwifi无线网卡源代码阅读

    转自:http://xiyong8260.blog.163.com/blog/static/66514621200892465922669/ 在我的Doctor课题研究中,基于ARF协议设计了一个改进 ...

  8. 非常好!!!Linux源代码阅读——内核引导【转】

    Linux源代码阅读——内核引导 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 目录 Linux 引导过程综述 BI ...

  9. 【block第四篇】实现

    -------------------------------------------欢迎查看block连载博客[专栏]--------------------------------------[b ...

随机推荐

  1. 【系统设计】论文总结之:Butler W. Lampson. Hints for computer system design

    Butler W. Lampson. Hints for computer system design. ACM Operating Systems Rev. 15, 5 (Oct. 1983), p ...

  2. Aa3.0 事件机制

    说明:本文由多处网络文章整理而成,在此未一一注明原文链接,敬请谅解! AS3:事件流机制  事件流 只要发生事件,Flash Player就会调度该事件对象. 如果事件目标不在显示列表中,则Flash ...

  3. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  4. echart+jquery+json统计TP数据

    由于工作需要,需要统计交易数据的TP50,TP90,TP95,TP99.采用的前端技术是jquery+json+echart. 一.TP定义(谷歌) Calculating TP is very si ...

  5. php 编程效率(3)

    提高php编程效率的53个小知识点:用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中 搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当 ...

  6. MFC 控件用法

    1:IP Control 变量CIPAddressCtrl m_iAddr 关联DDX_Control(pDX,IDC_IPADDRESS1,m_iAddr); 设置地址:m_iAddr.SetAdd ...

  7. 成为java高手的八大条件

    1.扎实的基础  数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序.程序人人都会写,但当你发现写到一定程度很难再提高 的时候,就应该想想是不是要回过头来学 ...

  8. ios隐藏软键盘

    //判断是否为苹果 var isIPHONE = navigator.userAgent.toUpperCase().indexOf('IPHONE')!= -1; // 元素失去焦点隐藏iphone ...

  9. 残酷中蜕变的SEOer

    SEO在不断蜕变,今天的自己推翻昨天的自己. 大牛说"SEOer们走的路不同,最终都会殊途同归."   最后都会炼出"SEO的道"最终都会回归到网站基础工程.毕 ...

  10. JSON及与XML比较

      JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Decem ...