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

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中去。

时间: 2024-11-10 10:28:08

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

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

代码里面发送粘性事件代码如下: // 发送Sticky事件 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), "soyoungboy"); 然后我们进入postSticky方法里面去: EventType 是什么? 该类是描述一个函数唯一性的对象,参数类型.tag两个条件保证了对象的唯一性.通过该类的对象来查找注册了相应类型和tag的所有订阅者{@see* Sub

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

代码里面注销eventbus一般我们会在onDestory里面这么写: 1 EventBus.getDefault().unregister(this); 然后走到unregister里面去看看: 1 /** 2 * @param subscriber 3 */ 4 public void unregister(Object subscriber) { 5 if (subscriber == null) { 6 return; 7 } 8 synchronized (this) { 9 mMet

《你的灯亮着吗》阅读笔记之第三篇与第四篇

我们平时解决某个问题的时候,是不是也遇到过,用某个方法解决完问题后,是不是又会出现新的问题,新的问题得到解决后是不是又出现了更新的问题,不知道你有没有遇到过,反正我是遇到过,尤其是在敲代码写软件的时候,当你想解决某个输出问题时候,想用某一个控件解决了这个输出问题,但是这个控件放上来后,控件的属性,用法问题又会出现在你的面前,不知道举这个例子是不是很合适啊,权且算是合适吧. 当我们遇到这样问题的时候我们是怎么解决的呢?我们是不是忽视了一些什么?我们有没有回头看看?书中说道:“如果在你对问题的理解中

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

Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处理原则 Linux 中断机制 中断控制器 中断描述符 中断数据结构 中断的初始化 内核接口 中断处理过程 CPU 的中断处理流程 保存中断信息 处理中断 从中断中返回 编写中断处理程序 软中断.tasklet与工作队列 上半部与下半部 软中断 tasklet 工作队列 1 为什么要有中断 1.1 中

认识元数据和IL(中)&lt;第四篇&gt;

书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知,下面是时候来了解什么是元数据,什么是IL这个话题了,我们继续. 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注

淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划

SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理运行计划. 前两个步骤请參见我的博客<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--解析SQL语法树>>和<<淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划>>.这篇博客主要研究第三步,生成物理查询计划. 一. 什么是物理查询计划 与之前的阅读方法一致,这篇博客的两个主要问题是what 和how.那么什么是物理查询计划?物理查询计划可以直接运行并返回数据

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

本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Eclipse中运行Tomcat源代码,本文介绍一下Tomcat的总体结构. 本文没有特别指明的地方,源代码都是针对tomcat7.0.42来说. Tomcat的总体结构 Tomcat即是一个Http服务器也是一个Servlet容器,它的总体结构我们可以用下图来描述: 通过上图我们可以看出Tomcat中

程序员的源代码阅读方法

正确的学习方法不仅能够让你事半功倍,也能够让你更加接近真理.初学一个工程的源代码,往往让初学者手足无措.下面的方法希望为初学者带来启示和便利.这个学习方式是基于编译环境和语言比较熟悉的基础上.最重要的是你要确定你要阅读的源代码是一份好代码.因为阅读代码就像阅读书籍.好代码让你终生受益,坏代码会给你留下阴影. 一.先把源代码安装起来编译起来,结合它的文档和手册,熟悉其功能和它的应用方式.如果遇到的是英文文档,那么首先恭喜你,如果硬着头皮看下来,不仅能在国内开此系统或框架的先河,而且能让你阅读英文的

Tomcat 设计模式总结(Tomcat源代码阅读系列之八)

本篇我们将来分析一下Tomcat中所涉及到设计模式,本文我们将主要来分析外观模式,观察者模式,责任链模式,模板方法模式,命令模式. 在开始本文之前,笔者先说明一下对于设计模式的一点看法.笔者曾经经常看到网上有人讨论设计模式,也偶尔会遇到有人非要严格按照GOF设计模式的类图以及其中的角色去套用别人的设计,只要类图不一样,或者角色多了或者少了就会觉得怎么和官方定义的模式不一样,其实这都是对设计模式的误解.设计模式其实不仅仅存在软件行业,各行各业其实都有模式,它是所在行业对一些通用问题解决方案的总结和