AndroidEventBus V1.0.4版发布啦
如果对于AndroidEventBus不了解的同学请移步 AndroidEventBus的设计与实现。AndroidEventBus库的github地址在这里。
新版特性
- 支持Sticky事件;
- 弱引用持有订阅者,避免内存泄露。
什么是Sticky事件?
关于Sticky事件有的同学可能不是很熟悉,Sticky的意思是粘性的。在Android开发中,Sticky事件只指事件消费者在事件发布之后才注册的也能接收到该事件的特殊类型。Android中就有这样的实例,也就是Sticky Broadcast,即粘性广播。正常情况下如果发送者发送了某个广播,而接收者在这个广播发送后才注册自己的Receiver,这时接收者便无法接收到刚才的广播,为此Android引入了StickyBroadcast,在广播发送结束后会保存刚刚发送的广播(Intent),这样当接收者注册完Receiver后就可以接收到刚才已经发布的广播。这就使得我们可以预先处理一些事件,让有消费者时再把这些事件投递给消费者。
AndroidEventBus也提供了这样的功能,有所不同是AndroidEventBus会存储所有的Sticky事件,如果某个事件在不需要再存储则需要手动进行移除。用户通过Sticky的形式发布事件,而消费者也需要通过Sticky的形式进行注册,当然这种注册除了可以接收Sticky事件之外和常规的注册功能是一样的,其他类型的事件也会被正常处理。发布、接收Sticky事件的步骤有如下几步 :
1、发布Sticky事件;
EventBus.getDefault().postSticky("hello");
2、 某个时刻订阅者以Sticky的形式注册
public class MyReceiver {public MyReceiver() {EventBus.getDefault().registerSticky(this);}@Subscriberprivate void onStickyEvent(String info) {System.out.println("接收到事件 : " + info);}}
当在某个时刻构造MyReceiver时就会将MyReceiver对象以Sticky的形式注册到EventBus中,此时先前发布的”hello”事件就会被MyReceiver对象接收到,因此就会执行onStickyEvent
函数,在该函数中实现具体的逻辑即可。当然,不要忘了在某个时刻将MyReceiver注销,以弱引用的形式持有订阅者的功能还没有完成呐!整个过程就这样结束了~
Sticky事件的运用场景
上文中我们简单讲述了Sticky事件的基本使用步骤,这里我们以一个具体的示例来看看Sticky事件在开发中的使用场景。
在开发过程中,我们经常需要在Activity之间传值,我们的做法就是将数据塞到Intent中,并且为每个数据设置一个key。当我们传递的数据是一个实体类时,我们的这个类还需要实现序列化接口,比如Parcelable或者Serializable。例如我们需要将一个用户对象传递到用户个人信息展示页面。我们的常规做法是这样的:
User.java类 :
// 实体类实现序列化
public class User implements Parcelable {String name ;String phoneNum;// 其他字段省略public User(String aName) {name = aName ;}public User(Parcel in) {super(in);name = in.readString();phoneNum = in.readString();}// 代码省略@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeString(phoneNum);}public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {@Overridepublic User createFromParcel(Parcel source) {return new User(source);}@Overridepublic User[] newArray(int size) {return new User[size];}};}
然后我们要在某个Activity中将这个用户数据传递给个人信息界面ProfileActivity。代码如下 :
public class MainActivity extends Activity {// 某个点击事件@Override public void onClick(View v) {User aUser = new User("Mr.Simple");aUser.phoneNum = "123456";// 其他数据Intent intent = new Intent(this, ProfileActivity.class);intent.putParcelable("user", aUser);startActivity(intent);}
}
在某个点击事件的处理函数中我们通过Intent将数据传递给ProfileActivity。我们再看看ProfileActivity从Intent中取出数据的代码。
public class ProfileActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_profile);// 从Bundle中获取数据Bundle extraBundle = getIntent().getExtras();if (extraBundle != null) {User user = extraBundle.getParcelable("user");}}
}
OK,至此整个过程才算结束了。
大哥,我只是需要传个数据啊!何苦啊!
这种方式产生了很多的样板代码,也让逻辑变得更复杂,容易出错。我们再看看使用Sticky事件的实现方式。
User.java类 :
// 实体类实现序列化
public class User {String name ;String phoneNum;// 其他字段省略public User(String aName) {name = aName ;}// 代码省略}
首先User类不需要实现序列化接口,避免了那些样板代码。然后在MainActivity中直接将User对象作为Sticky事件发布即可。
public class MainActivity extends Activity {// 某个点击事件@Override public void onClick(View v) {User aUser = new User("Mr.Simple");aUser.phoneNum = "123456";// 其他数据// 发布Sticky事件EventBus.getDefault().postSticky(aUser);// 跳转到ProfileActivity页面Intent intent = new Intent(this, ProfileActivity.class);startActivity(intent);}
}
最后我们看看ProfileActivity如何接收数据。
public class ProfileActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_profile);// 以Sticky的形式注册EventBus.getDefault().registerSticky(this);}@Subscriberprivate void receiveUser(User info){// 这里实现你的逻辑即可, info即为传递过来的User对象}}
在ProfileActivity中我们将ProfileActivity自身作为订阅者注册到总线当中,此时ProfileActivity就会接收到上面发布的Sticky事件,这个事件对象就是User对象。此时就会触发ProfileActivity 中的receiveUser函数,info参数就是Sticky事件的那个用户信息对象,在receiveUser中实现自己的逻辑即可。
是的!我们并没有在onDestory中对订阅者进行注销,也就是没有调用EventBus的unregister()函数,这就是最新版的特性之一,也是目前唯一不需要手动注销的事件总线库。
问题是不是简单了很多~ 还有什么场景可以使用Sticky事件呢?Sticky事件是否应该消费完之后自动移除?这些问题大家可以自行思考或者给我留言(simplecoder.h@gmail.com),谢谢。
AndroidEventBus V1.0.4版发布啦相关推荐
- html5互动场景制作系统,春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版发布...
经过一个月的艰苦努力,春哥团队最新作品即将与大家见面了,<2015年6月春哥技术博客高仿易企秀H5场景应用制作平台源码V1.0正式版>即将来临, 现在春哥接受预定啦,春哥技术博客依然走价格 ...
- 赛桨PaddleScience v1.0正式版发布,飞桨科学计算能力全面升级!
AI for Science日益表现出突破传统科学研究能力瓶颈的巨大潜力,正在成为全球科学研究新范式.近年来,各学科不断加入,模型精度.泛化性逐渐提高,不同技术路径.不同应用场景的AI for Sci ...
- Nihao Flash3D v1.0稳定版发布
Nihao Flash3d v1.0下载 Nihao3D_1.0.air (1.37 MB) 下载次数: 3244 2011-10-17 10:21 介绍文档下载 nihaoflas ...
- 路过秋天版博客 V2.0 正式版发布 增加后台管理系统[支持多语言、多用户、多数据库、目录级URL]...
路过秋天版博客发布历史回顾: 1:2010年11月08日---支持多语言.多用户.多数据库.目录级URL之路过秋天版博客发布[绝对有杀伤力的博客] 2:2010年11月10日---基础却容易被忽略的那 ...
- [Android应用]《花界》V1.0 正式版隆重发布!
http://www.cnblogs.com/qianxudetianxia/archive/2012/04/05/2433669.html 1. 软件说明(1). 花界是一款看花软件:"看 ...
- [Android应用]《花界》V1.0 正式版隆重发布!
1. 软件说明(1). 花界是一款看花软件:"看花,议花,说花,提高您的赏花素养!". (2). 发布<花界>V1.0正式版,一是检验,综合,统一本博客技术分析,二是从 ...
- 侠客博客v1.0 正式版版本发布
欢迎来到本页面,我猜想您一定是带着疑问进来的,那么首先我来介绍一下 侠客博客 这个软件吧.他是一款能帮助SEO人士自动做外链的软件.目标是在未来几个月发展成为类似虫虫一样庞大的外链软件.帮助站长提高网 ...
- 反恐精英模组 csJKL v1.6.a.0 初始版发布
反恐精英cs模组 csJKL v1.6.a.0 初始版发布: 游戏简介: csJKL mod v1.6 是由 csJKL大军 原创改版开发的cs1.6模组(mod), 本次发布的为多武器8个o4威力加 ...
- VS终结者即【Breeze's Terminator】 V1.0 正式版【完美版】发布
经过一天的测试,Terminator of VS Client 终于到达正式版,兴奋呀,累呀... ☆ 功能 ☆ * 完美终结VS3.0正式版 以及 3.12测试版 反作弊模块,能开任何图,打开任何外 ...
最新文章
- 晶体管参数在实际使用中的意义
- nginx产生【413 request entity too large】错误的原因与解决方法
- RocketMQ介绍与云服务器安装
- 二叉树的基本概念以及基本操作
- 【论文阅读】开放域问答论文总结,文本召回与问答的另一种思路
- 私有github java调用_使用Java API从GitHub获取所有提交
- background:url(./images.png) no-repeat 0 center的用法
- win10下安装多个cuda(cuda9.0和10.0),并自由切换版本
- Java Sigar Windows 监控系统
- 第一个程序(fishc
- python流量分析_python 监控流量
- 计算机查找dll文件,怎么查看进程正在调用哪些DLL文件
- ubuntu linux 软件安装位置,ubuntu查看软件安装位置
- Jupyter Notebook切换conda虚拟环境
- 大学英语四级考试必读必备
- Datadog数据包分析
- oracle 11g 更改sid和dbname
- 华为手机怎么隐藏按键图标_原来华为手机右上角隐藏扫描仪!纸质档一键电子化,真的涨知识了...
- 读秀更新到V4.0了,会自动提醒验证码输入,支持包库全文下载
- FCK编辑器在项目中的引入
热门文章
- 西安建筑科技大学考研信息2023年
- android 切换系统语言,输入法也随之切换
- 【网络通信 -- 直播】SRS 实战记录 -- SRS 部署与直播效果测试
- raft协议(Replicated And Fault Tolerant)初探
- 红米8出现android,别上当:山寨红米Note8已经出现,卢伟冰亲自辟谣了
- 鸿蒙系统的手机哪款最好,鸿蒙系统发布时间 华为鸿蒙系统手机两千元年底推出?...
- 程序的各段存在RAM还是ROM?
- windows mysql密码忘了怎么办_windows下忘记mysql密码怎么办
- idea集成svn 从svn下载项目流程
- 怎么用ocr实现多张图片的扫描,并转为Excel