Android EventBus使用

EventBus是一款针对Android定制的[发布/订阅]事件总线。它让我们轻松的处理四大组件之间的事件传递,而且速度更快,整个包的体积也较小(只有不到50K的的大小)。
本博文将对EventBus的使用和进行解析。
PS:本文基于EventBus 3.0版本进行解析。

1. EventBus是什么?

官网给出的解释:EventBus是针对Android定制的[发布/订阅]事件总线。
下图是对其的一个简单概述:


EventBus-Publish-Subscribe.png

2. 如何使用(3步)

只需要简单的三个步骤,我们便可轻松在项目中使用EventBus,下面描述如何在我们的项目中使用它。

  1. 定义事件
public static class MessageEvent { /* Additional fields if needed */ }
  1. 准备订阅者
  • 声明接收事件的注解方法
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};
  • 订阅或取消订阅(以Activity为例)
 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 } 
@Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
  1. 发布事件
EventBus.getDefault().post(new MessageEvent());

3. 使用要点分析

在注册接收事件的方法时,使用@Subscribe注解时我们需要提供一个threadMode的参数,那么下面我们首先来分析下Subscribe注解的使用。

  • Subscribe的定义
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
    ThreadMode threadMode() default ThreadMode.POSTING;

    /**
     * If true, delivers the most recent sticky event (posted with
     * {@link EventBus#postSticky(Object)}) to this subscriber (if event available).
     */
    boolean sticky() default false;

    /** Subscriber priority to influence the order of event delivery.
     * Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before
     * others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of
     * delivery among subscribers with different {@link ThreadMode}s! */
    int priority() default 0;
}

在使用注解时我们可以提供以下参数:
* threadMode(线程运行模式)
* sticky(是否接收的是粘性事件)
* priority(接收事件的优先级)

ThreadMode

ThreadMode是一个枚举,有以下值提供:

  • POSTING
  • MAIN
  • BACKGROUND
  • ASYNC
  1. POSTING
  • 发布事件和订阅事件运行在同一个线程,这也是默认值。
  • 此时事件分发传递开销较小,因为它避免了完全线程切换。
  • 这是不需要主线程简单任务的推荐模式。
  • 使用此模式的事件处理程序必须快速返回,以避免阻塞发布线程,因为这可能是主线程。
  1. MAIN
  • 订阅者将在Android主线程中被调用。
  • 如果发布者是在主线程中发布事件,那么事件处理方法将被直接调用。
  • 事件处理方法必须快速返回,防止阻塞主线程。
  1. BACKGROUND
  • 订阅者将在后台线程中被调用。
  • 如果发布者线程不是主线程,事件处理方法将直接在发布者线程中调用。
  • 如果发布者线程是主线程,EventBus使用一个单独的后台线程,它将顺序地提供其所有的事件。
  • 使用此模式的事件处理方法应该尝试快速返回,防止阻塞后台线程。
  1. ASYNC
  • 订阅者总是在一个单独的线程中被调用。这个线程独立于主线程和发布线程。
  • 如果事件的处理为耗时操作,那么推荐使用该模式。
  • 注意限制并发数量。
  • EventBus使用线程池来解决线程重用问题。

4. 黏性事件

  1. 如何使用
//注册事件接收方法
@Subscribe(sticky = true)
public void XXX(MessageEvent messageEvent) {
    ......
}
//发送黏性事件
EventBus.getDefault().postSticky(new MessageEvent("test"));
  1. 区别

那么黏性事件与普通事件有什么区别呢?

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

推荐阅读更多精彩内容

  • 前言:EventBus出来已经有一段时间了,github上面也有很多开源项目中使用了EventBus。所以抽空学习...
    Kerry202阅读 1,286评论 1 2
  • EventBus 是一个Android端优化的 publish/subscribe 消息总线,简化了应用程序各个组...
    王世军Steven阅读 1,852评论 4 21
  • 对于Android开发老司机来说肯定不会陌生,它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码...
    飞扬小米阅读 1,475评论 0 50
  • Demo地址:https://github.com/jiutianbian/android_learn/tree/...
    就天边阅读 1,261评论 0 1
  • 1
    Mary小姐阅读 171评论 0 0