Android消息传递EventBus的使用

好久没更新博客了,思来想去,时隔半年又重新了回来了 最近项目更新想用下greenrobot的eventbus,之前都是传统的Intent,Handler,Broadcast...... eventbus出现的很早,只是咱们的项目还木有用上,今天就来看看这个吧
  • 官方Eventbus
    官方文档
  • 啥是EventBus?
    EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。
  • 下载jar包或者直接Androidstudio里面引用
    库地址
build.gradle添加引用
compile 'org.greenrobot:eventbus:3.0.0'
  • 官方图解



    EventBus

  • EventBus 角色介绍
 Event        传递的事件对象
 Subscriber   事件的订阅者 
 Publisher    事件的发布者
 ThreadMode   定义函数在何种线程中执行
  1. 定义一个事件类型
public class MsgEvent1 {
        private String msg;
        
        public MsgEvent1(String msg) {
                super();
                this.msg = msg;
        }

        public String getMsg() {
                return msg;
        }
}
  • 订阅者
@Subscribe  
public void onMessageEvent(MessageEvent event){  
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();  
}  
@Subscribe  
public void handleSomethingElse(SomeOtherEvent event){  
    doSomethingWith(event);  
} 
  • 注册和解绑EventBus,发送
@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      EventBus.getDefault().register(this);  
}  
@Override
protected void onDestroy() {
      super.onStop();  
      EventBus.getDefault().unregister(this);  
}  
发送事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));  
EventBus中事件的发送及订阅是通过事件类型,就是上面定义的MessageEvent,由他进行匹配
  • EventBus四种线程模式

ThreadMode.POSTING ThreadMode.MAIN ThreadMode.BACKGROUND ThreadMode.ASYNC

  1. 默认模式
@Subscribe(threadMode = ThreadMode.POSTING)   
public void onMessage(MessageEvent event) {  
    log(event.message);  
}  

ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行
ThreadMode.MAIN:表示会在UI线程中执行
ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
ThreadMode.ASYNC:加入后台任务队列,使用线程池调用

Sticky Events使用方法

如果之前事件使用postSticky进行发布且执行过,则当sticky为true的订阅者再次订阅时,会去stickyEvents去查找事件,然后立即去post执行。

eg:
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus"));  

@Subscribe(sticky = true)  
    public void onEvent(MessageEvent event) {  
        textField.setText(event.message);  
    } 

如果使用也可以移除之前发布过的postSticky
eg:
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);  
// Better check that an event was actually posted before  
if(stickyEvent != null) {  
    EventBus.getDefault().removeStickyEvent(stickyEvent);  
} 

Subscriber Priorities(优先级)
优先级越高越优先执行,默认的优先级为0,priority 设置优先级别,整数,数值越大优先级别越高,则能优先收到订阅消息

      @Subscribe(threadMode = ThreadMode.PostThread,priority = 1)
      @Subscribe(threadMode = ThreadMode.MainThread,priority = 2)
      @Subscribe(threadMode = ThreadMode.BackgroundThread,priority = 3)
      @Subscribe(threadMode = ThreadMode.Async,priority = 4)    

register的函数重载中有一个可以指定订阅者的优先级,我们知道EventBus中有一个事件类型到List<Subscription>的映射,在这个映射中,所有的Subscription是按priority排序的,这样当post事件时,优先级高的会先得到机会处理事件。

优先级的一个应用就事,高优先级的事件处理函数可以终于事件的传递,通过cancelEventDelivery方法,但有一点需要注意,这个事件的ThreadMode必须是PostThread,并且只能终于它在处理的事件。

  1. 缺点
    无法进程间通信,如果一个应用内有多个进程的话就没办法了

  2. 注意事项及要点

同一个onEvent函数不能被注册两次,所以不能在一个类中注册同时还在父类中注册
当Post一个事件时,这个事件类的父类的事件也会被Post。
Post的事件无Subscriber处理时会Post NoSubscriberEvent事件,当调用Subscriber失败时会Post SubscriberExceptionEvent事件。

@Subscribe(priority = 1);  
public void onEvent(MessageEvent event) {  
    //逻辑处理
}  

EventBus中还有个Util包,主要作用是可以通过AsyncExecutor执行一个Runnable,通过内部的RunnableEx(可以搜索异常的Runnable)当Runnable抛出异常时通过EventBus发消息显示错误对话框

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 3,147评论 0 6
  • 一、简介 EventBus是由greenrobot 组织贡献的一个Android事件发布/订阅轻量级框架。Even...
    Mr丶sorrow阅读 14,962评论 0 13
  • 原文链接:http://blog.csdn.net/u012810020/article/details/7005...
    tinyjoy阅读 536评论 1 5
  • 先吐槽一下博客园的MarkDown编辑器,推出的时候还很高兴博客园支持MarkDown了,试用了下发现支持不完善就...
    Ten_Minutes阅读 555评论 0 2
  • 【养生篇】其实养生不难,我们不需要学很多深奥的医学知识,我们只需懂得一些生理上的常识,比如饭不要吃得十分饱,太饱了...
    晨曦_邱月晖阅读 290评论 0 0