EventBus原理解析

EventBus(发布订阅事件总线):通过解耦发布者和订阅者简化android 事件传递

EventBus is a publish/subscribe event bus for Android and Java.

开源库地址:https://github.com/greenrobot/EventBus

一、EventBus 简介

1.简化了不同组件间(Activity,Fragment,Service) and 异步线程(Background Thread)与UI主线程间的通信

2.传统的事件(消息)传递方式有:Intent、接口回调、Handler、BroadcastReceiver ,

相比之下 EventBus 的优点:是代码简洁,使用简单,解耦事件的发布和订阅,更快,代码更小,50K 左右的 jar 包

3.结构关系图:EventBus 负责存储订阅者、事件相关信息,订阅者和发布者都只和 EventBus 关联,实现了事件发布和订阅的解耦

Events are posted ({@link #post(Object)}) to the bus, which delivers it to subscribers that have a matching handler method for the event type.

4.事件响应流程图:

订阅者首先调用 EventBus 的 register 接口订阅某种类型的事件,当发布者通过 post 接口发布该类型的事件时,EventBus 执行订阅者的事件响应函数。

二、基本概念:

1.事件(Event):其实就是一个Object对象,可以是String 类型,可以是一个自定义的Event对象,事件的分类:普通事件和黏性事件,EventType:表示事件所属的类

2.发布者(Publisher):发布某事件的对象 ,post(Object),postSticky(Object)

3.订阅者(Subscriber):订阅某种事件类型的对象,在事件响应函数中对事件进行处理

Event handling methods must be annotated by {@link Subscribe}, must be public, return nothing (void), and have exactly one parameter (the event).

三、如何使用

How to get started with EventBus in 3 steps

1.添加依赖库  compile'org.greenrobot:eventbus:3.1.1'

2.定义事件类型

3.声明订阅者事件响应方法:

Event handling methods must be annotated by {@link Subscribe}, must be public, return nothing (void), and have exactly one parameter

事件响应方法:必须:使用注解@Subscribe 声明 ,必须是public ,返回类型是void ,只有一个参数,Note that with EventBus 3 the method name can be chosen freely(EventBus3以后 方法名可以自定义)

4.注册、解注册事件: In Android, in activities and fragments you should usually register according to their life cycle.

Only while subscribers are registered, they will receive events.

5.Post events: Post an event from any part of your code. All currently registered subscribers matching the event type will receive it. 所有与事件类型相匹配的当前已注册的订阅者都可以收到事件

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

四、源码解析:

1. ThreadMode: http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/

线程模型:ThreadMode类是枚举类,在订阅者事件响应方法中,可以通过注解的方式设置线程模型,EventBus内置了4中线程模型,分别是ThreadMode.POSTING 、ThreadMode.MAIN、ThreadMode.BACKGROUND、ThreadMode.ASYNC

public enum ThreadMode {

    POSTING,(默认的模式)

    MAIN,

    MAIN_ORDERED,

    BACKGROUND,

    ASYNC

}

(1). POSTING:事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行——收发在同一个线程(由于发布事件方法可能运行在主线程,这意味着接收方法中不能执行耗时操作,否则会阻塞主线程)

(2).MAIN:不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中立即执行(这意味着接收事件方法不能执行耗时操作,否则会阻塞主线程;同时,由于是「立即」调用,所以发射事件方法此时是会被接收事件方法所阻塞的)

(3).MAIN_ORDERED: 接收事件方法会被放入 MessageQueue 中等待执行(这意味着发射事件方法是不会被阻塞的)

(4).BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行(不能执行UI更新操作)

(5).ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行(不能执行UI更新操作)

2.黏性(Sticky )事件:当事件发布后,再有订阅者订阅该类型事件,依然能收到该类型事件最近一个 Sticky 事件。

3.Subscribe

线程模式,黏性事件,线程优先级

4.EventBus

register

unRegister

post

5.EventBusBuilder

参考文献:

http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90

http://www.cnblogs.com/zhaoyanjun/p/6039221.html

https://github.com/greenrobot/EventBus

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

推荐阅读更多精彩内容

  • EventBus 是一款在 Android 开发中使用的发布/订阅事件总线框架,基于观察者模式,将事件的接收者和发...
    SheHuan阅读 65,433评论 13 185
  • EventBus 是一个Android端优化的 publish/subscribe 消息总线,简化了应用程序各个组...
    王世军Steven阅读 1,846评论 4 21
  • 项目地址:EventBus,本文分析版本: 3.1.1 一、概述 EventBus 是一个 Android 事件发...
    Yi__Lin阅读 1,034评论 1 10
  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 3,174评论 0 6
  • 先吐槽一下博客园的MarkDown编辑器,推出的时候还很高兴博客园支持MarkDown了,试用了下发现支持不完善就...
    Ten_Minutes阅读 560评论 0 2