Otto事件总线框架的使用

Otto是一个在Android中的事件总线框架,它是square的一个开源框架,具体介绍点击这里,项目下载点击这里

为什么要使用Otto事件总线:

通常来说在Android中:
1、Activity与Activity间的传值是通过Intent,值回调是通过startActivityForResult()
2、Activity与Fragment间的传值是通过setArguments,值回调是通过实现onAttach()的Interface方式
3、而Fragment与Fragment间的交互则应该是通过它们关联的Activity作为中间键来交互
4、包括Activity与Service的交互,可能众多同学会采用Binder机制来处理,而其实Binder机制本质也是通过接口回调方式来进行值回调的
5、或者在更复杂的应用场景下,比如:ActivityA跳转到ActivityB,ActivityB跳转到ActivityC,此时需要从ActivityC中获取到用户的操作数据返回到ActivityA和ActivityB中显示,或者在Activity中有多个Fragment,其中一个Fragment里的数据变化需要同步更新其它Fragment的数据变化,这时候如果使用Interface的方式进行它们间的交互则比较复杂,耦合度也高

 

所以,针对上面这些问题,大多数在处理值交互的问题上类之间都是耦合在一起的,而Otto事件总线框架就是降低各个类间的耦合度的。

Otto事件总线

Otto中真正用到的就只有一个类两个注解三个方法:

  1. Bus – 管理注册、注销和发布事件
  2. @Produce – 标记该方法是生产者,产生的事件内容为该方法的返回值
  3. @Subscribe – 标记该方法是订阅者,表示订阅了一个事件,方法需要修饰符为public,而区分不同的订阅者是通过方法的参数来区分的,且订阅了某事件的所有订阅者都可以收到该事件
  4. register(Object obj) – 注册,订阅事件前都需要注册
  5. unregister(Object obj) – 注销,放弃之前所有事件的订阅
  6. post(Object event) – 发布一个事件,这个事件会被所有标记了@Subscribe注解的方法获得

使用Otto事件总线

首先添加依赖:

 

1、为了避免重复创建Bus对象,我们先为Bus创建一个单例对象

2、创建一个Bean,用来传递各类间的数据

 

3、在MainActivity中注册并且创建订阅者订阅数据

 

4、在TestActivity中发布事件

发布事件有两种方法:

1、使用@Produce注解来生产事件,不过它生产事件前它需要注册、生产完事件后需要注销,如果使用这种方法则在跳转到生产者所在的类中则会立即产生事件触发订阅者,即在MainActivity跳转到TestActivity时,会立即产生事件并订阅了该事件的方法会收到该事件,如:

 

则在MainActivity跳转到TestActivity时订阅者会马上收到事件,输出的Log信息为:

2、通过post()来发布事件,它不需要注册和注销,而且它不会在界面跳转时马上发布事件,而是我们人为的控制该事件什么时候发布,使用如下:

当我们点击按钮时候,这个事件就发布出去了,而订阅了该事件的方法就会收到,打印的Log为:

 

【注】:发布事件需要发布的是一个Object对象,而且这个对象不能为null,所以在数据量大的时候我们可以创建个Bean类,而传当个数据时候如字符串等则直接传String就好。

可以看到通过Otto事件总线来处理类与类之间的交互,可以使得我们的代码更容易理解,类与类之间也解耦了。

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 2 收藏 5 评论

关于作者:Sunzxyong

热衷移动Android开发 个人主页 · 我的文章 · 8 ·      

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 贤惠吃地瓜 Android开发 2015/12/10

    谢谢分享 看起来好像很好用的样子

  • 发布事件的post方法跟第一种写成一样了,改正一下。

  • 汤姆猫   2015/12/10

    ACT与ACT之间通信不建议使用OTTO,ACT与ACT之间通信官方推荐用Intent,为什么用Intent?看过源码理解原理都知道Intent通信是基于binder简单的说就是对数据做了深度克隆让ACT与ACT之间的数据使用解耦避免内存溢出(Act1被finish了而别的Act2还持有Act1中的数据引用导致Act1的内存空间无法被系统回收),而使用OTTO对通信数据没有做隔离所以只建议使用在Act内(比如:View与View之间,fragment与fragment)

  • lumen   2015/12/14

    刚试用了一下,挺好用的

  • 天海   2015/12/19

    测试例子,用过!

跳到底部
返回顶部