文档章节

事件总线框架---Otto

Jack_1900
 Jack_1900
发布于 2014/08/18 21:49
字数 1270
阅读 2990
收藏 22

我们假设这样一种业务场景,现在在做一款及时聊天应用,我们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时我们该如何去实现?说说我以前的实现策略,我使用的是广播接收器BroadCastReceiver,在接收和发送消息的时候就不停去发送广播,然后在需要实时更新的地方进行接收更新。实现的思想比较简单,也不存在代码上的耦合问题,但是有个弊端。弊端就是需要去在很多地方实现BroadCastRecevier,代码虽不算冗余,但比较多,看起来很是不爽。

今天为大家介绍的Otto,就能彻底解决代码体积的问题。Otto是一款目前比较流行事件总线框架,旨在保持应用各页面和模块之间通信高效的前提下,对应用进行解耦。Otto的使用很简单,源码也只就9个类,几千行代码,开放出来的api也间接明了。Otto是基于订阅/发布(Subscribe/Publish)这样一种设计模式,简单来说,如果你想订阅某个消息,使用@Subcribe注解即可进行接收,同时使用

Bus.post(Object obj)进行消息的发布,这样的设计达到了完全的解耦。

下面分步骤为大家简单介绍下使用过程。

一、Bus实例化

Bus这个类是整个框架的灵魂,它负责消息的发布和接收,整个流程都是经过这个Bus去实现的。Bus的实例化推荐使用单例,就是说整个应用内只实例化一个Bus对象,所有的消息的处理都是经过这单一的实例去实现。因为要实现消息的接受者接收到发布的消息,一定要经过同一个Bus对象的处理。Bus的构造器可以接收ThreadEnforcer类型的参数,ThreadEnforcer其实是一个接口,它自身有两个实现,分别表示Bus运行在Main Thread中还是异步线程中。

二、注册和解绑Bus

根据具体的业务需求进行Bus的注册和解绑,对于android中的组件,一般是基于生命周期方法中去实现;同时如果是任意你自定义的类中都可以进行。下面展示的是在Activity和Fragment里面实现。

、消息的发布

发布消息是整个框架中最重要的部分,它允许你告诉所有的订阅者一个事件已经触发。任何一个类的实例对象都可以通过总线Bus去发布,同时也只能被订阅这种对象的接受者所接收。下面展示的是通过Bus去发布一个消息,消息的内容是LocationChangeEvent,所以LocationChangeEvent的接受者都能接收到此发布的消息。注意的是,发布消息只能一个Object对象。

四、消息的订阅

消息的订阅和发布之前都要在当前的类中进行Bus的注册。订阅是对消息发布的补充,当消息发布的事件调用之后,对应的消息订阅者就能立即接收到此消息。实现订阅功能是通过自定义方法实现的,方法的名称可以随意,同时还得需要满足三个条件。

1、方法前使用@Subscribe注解

2、访问修饰符为public

3、单一参数,根据你想订阅的消息进行设置

注:使用之前,记得进行注册;使用完毕,记得释放。

五、消息的produce

当订阅者注册完毕,针对特定的消息,通常也需要获取当前已知的值。这个时候,就需要用到produce。同样的使用produce的方法名称可以随意,同时有三点需要注意。

1、方法前使用@produce注解

2、访问修饰符为public

3、无参,返回值是基于订阅者参数类型

好了,Otto的使用就是这些了。快去重构代码,摆脱无尽的广播吧!

当然Otto的缺点也是有的,要实现上述订阅/发布模型的功能,付出的代价就是对各个注册Bus的类进行反射。如果大量的使用的情况下,对应用的性能多少有点副影响。


Otto源码和Demo地址:https://github.com/square/otto

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。

技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。



© 著作权归作者所有

Jack_1900
粉丝 225
博文 35
码字总数 34078
作品 1
普陀
程序员
私信 提问
加载中

评论(5)

Jack_1900
Jack_1900 博主

引用来自“luforn”的评论

如果有两个Activity分别为A和B;现在从ActivityA跳转ActivityB并且ActivityB中发布消息,ActivityA中订阅消息;Bus的注册和解绑分别在onResume()和onPause()中操作的,那么从A跳转到B,A不是已经解绑Bus了嘛,它还能订阅到B中发布的消息吗?

引用来自“Jack_1900”的评论

如果unregister在post之前,那就是接收不到消息了

引用来自“luforn”的评论

如果在onResume()和onPause()中绑定和解绑的话,AcitivityA和ActivityB之间就不能通信了,那么Ott主要用在什么场景啊,只是Acitivity和Fragment之间吗?
任意类中都可以
luforn
luforn

引用来自“luforn”的评论

如果有两个Activity分别为A和B;现在从ActivityA跳转ActivityB并且ActivityB中发布消息,ActivityA中订阅消息;Bus的注册和解绑分别在onResume()和onPause()中操作的,那么从A跳转到B,A不是已经解绑Bus了嘛,它还能订阅到B中发布的消息吗?

引用来自“Jack_1900”的评论

如果unregister在post之前,那就是接收不到消息了
如果在onResume()和onPause()中绑定和解绑的话,AcitivityA和ActivityB之间就不能通信了,那么Ott主要用在什么场景啊,只是Acitivity和Fragment之间吗?
Jack_1900
Jack_1900 博主

引用来自“luforn”的评论

如果有两个Activity分别为A和B;现在从ActivityA跳转ActivityB并且ActivityB中发布消息,ActivityA中订阅消息;Bus的注册和解绑分别在onResume()和onPause()中操作的,那么从A跳转到B,A不是已经解绑Bus了嘛,它还能订阅到B中发布的消息吗?
如果unregister在post之前,那就是接收不到消息了
luforn
luforn
如果有两个Activity分别为A和B;现在从ActivityA跳转ActivityB并且ActivityB中发布消息,ActivityA中订阅消息;Bus的注册和解绑分别在onResume()和onPause()中操作的,那么从A跳转到B,A不是已经解绑Bus了嘛,它还能订阅到B中发布的消息吗?
TracyZhang
TracyZhang
用观察者模式进行回调也很方便啊
基于 Guava 的事件总线--Otto

Otto 是基于 Guava 的,增强的事件总线,强调 Android 支持。 Otto 是把应用分离成不同部分,但是仍然可以很好的进行通讯。Otto 是从 Guava forked 而来,但是添加了许多独特的功能,而且精炼...

李三石
2014/07/11
1K
0
Android EventBus二三事

废话很多的前言 EventBus,也即事件总线。在[wiki][event_monitor]上有关于Event Monitor的一个说法: Event monitoring makes use of a logical bus to transport event occurrences from so......

苦辛味
2014/09/21
1K
0
Otto事件总线 -- 控件之间通讯框架使用 --模式解析

前言:Otto事件总线 -- 控件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle、intent等,从activityA --- activityB用startActivity,用startActivityFo...

CMusketeer
2018/08/16
0
0
android 主流框架

2016-05-27 APP架构师 缓存 名称 描述 DiskLruCache Java实现基于LRU的磁盘缓存 2.图片加载 名称 描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库 Picasso 一个强大...

码娃娃
2016/05/27
320
0
Android事件总线框架Otto

1、下载EventBus的类库 源码:https://github.com/square/otto 2、基本使用 @Subscribe 订阅事件,也就是事件的处理者,它有且仅有一个参数YourEvent,每一个Subscribe对应处理一个YourEvent...

恰同学少年
2016/02/14
238
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
12
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
8
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部