EventBus3.0源码分析

基本使用方式:

1、build中依赖,直接使用
implementation 'org.greenrobot:eventbus:3.0.0'

2、在需要接收事件的Fragment或者Activity或者View中注册,并且加入订阅方法,在onDestroy中进行解除注册

EventBus.getDefault().register(this);

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageString(String s) {
//接收到事件
}

@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}

3、发送事件
EventBus.getDefault().post("post message");

上面是基本的用法,EventBus有两个要素,发送、订阅,先说订阅,因为你不订阅,事件发送出去也没地方接收

前言
我们先明确两件事件(我自己的归类):
订阅包含(注册、订阅、解除注册)
发送包含(发送普通事件,发送粘性事件,取消事件)

订阅

1、注册
EventBus有两种方式获取实例:
第一种通过EventBusBuilder的build去注册,这种方式可以自己去配置一些自己想要的属性
EventBusBuilder builder = EventBus.builder();
builder.build().register(this);

image.png
image.png

第二种直接采用默认配置
EventBus.getDefault().register(this);

register方法中,通过调用subscriberMethodFinder的findSubscriberMethods(subscriberClass)方法去查询出该订阅对象中所有的订阅方法(订阅方法就是带有@Subscribe注解的),并且将所有的订阅方法注册到EventBus中

image.png
image.png

2、订阅(Subscribe)
在注册的时候提到了一点,findSubscriberMethods(subscriberClass)方法会查询出所有的订阅方法,并注册到EventBus中去,这里的订阅要满足四个条件,Subscribe注解、public修饰、void返回、单参数

image.png
image.png

上面是Subscribe的注解类,我们可以看到里面有三个参数
2.1、threadMode:总共有五种mode

  • POSTING(默认):和发送事件处在同一线程中,因为他和发送事件处在同一线程,避免了线程切换,所以是开销最小的。使用此模式不要在主线程中发送事件,避免线程阻塞
  • MAIN:处于主线程中接收事件,别处理耗时操作,会阻塞
  • MAIN_ORDERED:处于主线程中接收事件,与MAIN不同,事件接收将始终等待传递(这是后期才出的模式)
  • BACKGROUND:如果发送事件在主线程,接收事件方法在后台调用,后台线程将依次交付事件;如果发送事件不是在主线程,则接收事件处于和发送事件同一个线程
  • ASYNC:接收事件处于一个独立的线程,EventBus使用线程池,重复利用已完成了异步订阅的线程

2.2、sticky:是否发送粘性事件,默认为false,粘性事件就是先发送,等到订阅者订阅后再接收事件
场景:请求到了数据,但是界面还没有完全初始化完成,那个时候还没有订阅者出现,这时候就需要用到粘性事件,先将事件发出去,等到订阅者出现后,再接收数据。

为了节省开销(postSticky的时候会将事件存进对象中去,不销毁会占着内存位置),发送粘性事件的时候记得一定要在订阅方法结束时使用removeStickyEvent回收掉这个粘性事件

2.3、priority:设置优先级的,相同的Mode下,优先级高的会比优先级低的更先接收到事件,默认为0

3、解除注册
** **解除注册的时候将从该订阅者中取出所有的订阅方法get(subscriber),然后从该订阅者中解除订阅(unsubscribeByEventType(subscriber, eventType)),全部订阅方法都解除了后,将该订阅者从EventBus中移除(remove(subscriber))

image.png
image.png

发送

1、发送普通事件
使用EventBus.getDefault().post("post message");来发送普通事件,
2、发送粘性事件
使用EventBus.getDefault().postSticky("post message");来发送粘性事件,粘性事件在订阅部分中提过了


image.png
image.png

粘性事件也是走post方法,post方法中会去遍历队列,执行postFin gleEvent方法,并且遍历一次就将队首remove掉,直到队列为空


image.png
image.png

postSingleEvent:根据event(这个就是订阅方法中的那个接收的参数)去查询出所有的订阅方法,然后调用每个订阅方法

这里建议每个订阅方法的参数都是一个实体类,别用通用类型的参数,比如String这种,不然发送的时候会给一些不需要的订阅方法传递参数

image.png
image.png
image.png
image.png

根据不同的线程模式,去调用相应的方法


image.png
image.png

EventBus的发送、接收流程大致就是这样

收!

参考链接:
感谢!感谢!感谢!
https://www.jianshu.com/p/1eaca34e5314
https://www.jianshu.com/p/92a4b2a5abc6

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

推荐阅读更多精彩内容