2019-10-31 EventBus的流程---菜鸡的踩坑之旅

最近真的忙,把身体都搞虚脱了,每天晕乎乎的,感觉只有搞技术的时候才是最舒服的时候,代码才是精神食粮啊,今天闲下来记录下载项目中使用的Eventbusd 流程,可能不是很详细,但是尽最大努力来分析下。

首先我将源码放到source insight中便于编辑。那接下一起看看eventbus的流程源码吧,

直接看红框部分,我特意将代码注释了一下,这个很常见,获取一个Eventbus的单例对象,这也是getdefault方法的用处。

接下来,看看里面注册方法做了什么,我们需要了解怎么注册的,

首先通过反射拿到外部传入的被观察类,注释中注释了,这里用了反射,首先我们看上面我的注释,首先找到被观察类和被观察类的所有方法,然后将类及其方法关联起来,我们一步步来,首先分析1,看看怎么找到所有方法。

可以看到,因为反射的性能不是很高,其中在编译期添加索引方式来提高性能,这是拿到我们外部传入的类的所有方法的过程,我们继续去深入怎么通过反射拿到方法信息,

这是通过反射拿到我们外部传入类中的方法,我先分了五步,我们一步一步来分析每个的作用和流程

首先我们来看1,FindState,这一看,我们大概就能猜测到,这个类是干什么的。对是否找到方法的状态管理。

这个就不多说了,不过这种方式确实值得借鉴。

再来看看3、

简单的赋值,需要注意点是,内部还涉及了我们定义类的继承关系,是否有父类,如果有,是否需要查找父类的方法,这个地方真的妞,不得不感叹做着逻辑思维非常的缜密。

回头继续看4,我们可以知道,首先通过判断外部的类是否已经实例化,如果已经实例化,则执行4和5.我们首先看4.


这里可以看到,涉及到外部我们指定了时间类型和执行的线程,那么到这里有一个疑问就是,eventbus怎么做到切换线程呢?带着这个问题,我们看下面的流程。

关于线程的切换,我们先看事件的发布,发布的时候肯定要指定对应的线程,那么这个时候我们就可以找到怎么去切换线程的。

                    此处拿到指定线程的状态

这是事件的发布,我们直接看注意这个地方,进入这个方法中查看,这个方法到底做了什么?

其实这个类还没有真正的发布事件,只是获取事件类型,然后交给postsingleForEventType方法执行,那么这个类是做什么的呢?我们大概了解下,这个方法确定当前事件和类是否已经关联起来。

箭头的地方就是我们外部指定的线程,拿到外部指定的线程,然后交给方框中的方法去执行,那么这个是怎么拿到的呢?肯定有这样的疑问,不慌,其实我也有这样的疑问,我们来往上找找,看到加粗的字体哪里,PostingThreadState postingState =currentPostingThreadState.get();,那么这个currentPostingThreadState我们这个时候可以猜的到了,肯定是一个ThreadLocal了,关于这个是干什么的,相信不陌生了,对,就是储存线程中的变量,保持每个线程中的变量不被其他线程所修改,

这就是线程怎么指定去执行的,那么接着看,

框起来的大致类似,我们先看这个红框里面的。

其实看源码,可以知道这些都是线程,其中 BackgroundPoster和AsyncPoster都实现了runable接口,这说明,这两个是在子线程中执行的

果然是这样的

好了,分析发布事件,线程指定,那么怎么接受事件呢?估计没跟着走的时候很可能有这个疑问,好,我来解答下,

就是这个方法,那么这个方法到底是干嘛的呢?知道反射的肯定了解这个方法,invoke方法用来在运行时动态地调用某个实例的方法,实际上也就是说这个方法在jvm底层时已经绑定了subcribe注解的方法,这个时候通过反射获取到当前方法的全部信息,因为我们用了subcribe注解,post事件的时候,我们建一个集合来装在所有带有注解的,通过invoke方法动态的调用每一个带有注解的方法,这就形成了一个完成的事件发送和处理

这里可以从注册的时候可以看出一二来,大致思路是这样的,细微之处就需要我们平时多研究下源码,其实看源码最大的思想是敢于大胆的去猜想,然后想方设法证实自己的猜想

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,076评论 1 32
  • 所有知识点已整理成app app下载地址 J2EE 部分: 1.Switch能否用string做参数? 在 Jav...
    侯蛋蛋_阅读 2,399评论 1 4
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,036评论 0 4
  • 大家好 你们可以叫我静静 我是一个普通的大学在校学生 有抑郁症的女孩 一个不愿意和别人去谈论 一个只有深夜有很多话...
    最丧少女阅读 219评论 0 1
  • @所有人: 导师从各个地方用各种不同的交通工具启程之时,请自行用手机拍摄一段视频,内容为:大家好,我是XXX,我现...
    张永红助力身心灵健康阅读 160评论 0 0