EventBus3 简单使用及注意点
博客: 安卓之家
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917
EventBus3 简介
EventBus Android 发布/订阅事件总线,可简化 Activities, Fragments, Threads, Services 等组件间的消息传递,可替代 Intent, Handler, BroadCast ,接口等传统方案,更快,代码更小,50K 左右的 jar 包,代码更优雅,彻底解耦。EventBus3 是最新版本,官网地址:
https://github.com/greenrobot/EventBus
使用
这里简单介绍下使用方法:
1 添加依赖 compile 'org.greenrobot:eventbus:3.0.0'
2 编写事件类
3 post 发布事件
这里有直接发布和滞留发布
//直接发布
EventBus.getDefault().post("直接发布");
//滞留发布
EventBus.getDefault().postSticky("滞留发布");
注意可以发布的是一个 Object
类,发送什么,订阅者就会接收什么。
此处要注意两个地方:
如果 post 字节数据,此时订阅者的方法里参数需为 Byte,而不是 byte,同样的,post int数据,订阅方法参数需为 Interger,其他基本数据类型同理
如果 post 字符串,那么所有方法的参数是 String 类型的订阅者都会接收到事件而执行方法。
4 订阅者接收事件
订阅的时候要注册和取消注册。
注册一般是在 onCreate
和 onStart
里注册,尽量不要在 onResume
,可能出现多次注册的情况,比如下面这个异常::
EventBusException: Subscriber class already registered to event class
可以先判断下:
if (!EventBus.getDefault().isRegistered(this)) {EventBus.getDefault().register(this);}
参看这里:GreenRobot EventBusException: Subscriber class already registered to event class
取消注册 要写到 onDestroy
方法里,不要写到 onStop
里,有时会出现异常的哦
EventBus 3 和之前版本的 EventBus 不兼容,这里采用注解的方法来接收事件,四种注解 @Subscrible
、@Subscrible(threadMode = ThreadMode.ASYNC)
、@Subscribe(threadMode = ThreadMode.BACKGROUND)
、@Subscribe(threadMode = ThreadMode.MAIN)
分别对应之前的 onEvent()
、onEventAsync()
、onEventBackground()
、onEventMainThread()
。
EventBus 3 采用注解后,方法名没有限制了,参数只有一个,和发送者 post 的参数对应配对,在未声明 threadMode 时,默认的线程模式为 ThreadMode.POSTING,只有在该模式下才可以取消线程,否则容易导致如下异常:
org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
由于可在任何地方都可以 post 一个事件,那么在不同线程之间传递事件,比如在工作线程传递一个事件更新UI线程中的一个控件,则需要注意 threadMode 的切换。
好了,基本使用大概就这些,后面遇到会补充…
2016.07.13补充:
今天遇到了订阅事件无法执行的情况,分析后发现是订阅事件的 Activity
还未执行的原因。
找到原因就好办了,这时候就需要用到 postSticky
。
发布事件时用 postSticky
操作:
EventBus.getDefault().postSticky(event);
订阅时,添加 sticky = true
@Subscribe(sticky = true) //看下 `@Subscribe` 源码知道 `sticky` 默认是 `false`
public void onEvent(Event e) { ---
}
这里也有个坑,就是 EventBus.getDefault().register(this);
注册时最好放到各变量初始化最后,否则可能会出现一些变量空指针异常。
混淆
没什么说的,复制下面代码到你的混淆文件即可:
-keepattributes *Annotation*
-keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *;
}
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable);
}
2016-09-06 更新as可用插件:
发布的事件多了以后,我们很难去管理,下面推荐个 AS 插件:
https://github.com/likfe/eventbus3-intellij-plugin
更多 AS 插件请访问:https://github.com/jp1017/AndroidStudioPlugins
欲知更多 EventBus 的内容,还可参考:
EventBus3新特性及用法
EventBus 源码解析
Android EventBus源码解析 带你深入理解EventBus
最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!
神奇的安卓开发网站:http://androidcat.com/
安卓开源库收集整理:https://github.com/XXApple/AndroidLibs
分享是一种美德,更是一种生活方式!!
也许你会说我是一个梦想者,但我不是唯一的一个。
悦分享,越快乐^_^
欢迎交流,转载请注明出处,谢谢!
EventBus3 简单使用及注意点相关推荐
- linux判断tomcat状态,LINUX下如何查看tomcat运行状态,判断其是否启动
1,查看Tomcat启动日志. ${catalina_home}\logs [root@iZ25b4ffkfaZ logs]# tail -f catalina.out Sep 10, 2015 11 ...
- EventBus3.0简单使用快速入门
加入引用 implementation 'org.greenrobot:eventbus:3.0.0' 自定义一个事件类 public class EventBusMessage {public St ...
- EventBus3.0源码解析
本文主要介绍EventBus3.0的源码 EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递. EventBus使用简单,并将事件发布和 ...
- EventBus3.0开发详解 近万开发者收藏
什么是EventBus? eventBus是GreenRobot公司出品的一个基于[publish/subscribe]模型的开发库 1.GreenRobot公司除了出品eventBus还出品了比较有 ...
- Android开源框架——事件总线 EventBus3.0讲解
开源项目地址 官网:https://github.com/greenrobot/EventBus 介绍 EventBus主要使用了观察者模式设计方案.主要替代Intent.Handler. Broad ...
- android EventBus的简单使用
今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...
- android EventBus的简单使用
今天,简单讲讲Android里关于EventBus的使用. 这几天,由于面试的缘故,我听到了很多Android的流行框架,但是之前自己在公司做APP时并没有使用,所以没有了解.于是在网上查找了资料,学 ...
- Android事件总线(一)EventBus3.0用法全解析
相关文章 Android事件总线(一)EventBus3.0用法全解析 Android事件总线(二)EventBus3.0源码解析 Android事件总线(三)otto用法全解析 Android事件总 ...
- EventBus简单介绍
EventBus简单介绍 EventBus简单介绍 EventBus作用 EventBus优缺点 EventBus使用步骤 EventBus的三要素(三个角色) Event Subscriber Pu ...
最新文章
- Arbitrage--POJ 2240
- 刚出炉的一套面试题(JAVA岗)
- dwarf tower
- vs2019使用webview2开发web浏览器
- 滴水穿石--MYSQL导入导出常用命令
- JAVA实现telnet代理,对输入命令拦截
- docker 容器安装conposer_docker和php:将依赖项(composer)放入容器中
- php自增删除开始,PHP的自增自减操作
- SharpDX for Winform
- Android Studio在线自动升级版本
- HyperAttentionDTI: improving drug–protein interaction prediction by sequence-based deep learning wit
- 小鸟壁纸 删除 卸载 流氓 鲁大师 360 软件 弹窗 后台
- 卡塔尔能源每年将向中石化供应400万吨液化天然气;哪吒汽车发布技术品牌浩智 | 美通企业日报...
- Excel中序号自动填充
- linux驱动:二、LED灯驱动编写
- 石墨文档 Websocket 百万长连接技术实践
- 本机ping不通虚拟机解决方法
- EOS、BPS怎样进行应用的部署
- Retrofit 使用
- Fiddler抓包抖音网络错误解决方案
热门文章
- STUFF()函数将查询的多行数据合并为一行
- 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧,建议收藏!!!
- 原神白铁矿位在哪里 原神白铁矿采集点位置分布图
- CSDN专访左程云,算法之道
- 泥壁鲁(80后 Kevin Yang from ChengDu) 银河帝国 海岛帝国 2012-4月 北美销售额 114w$ IOS(国内前10)...
- 科普|一文读懂NFT.Storage 创建过程
- web前端基础-HTML篇
- 一天一个 Linux 命令(37):killall 命令
- java ceil_Java使用Math.ceil舍入为一个int
- 1631 小鲨鱼在51nod小学 暴力