一、Otto介绍
OTTO是Square推出的库,地址:https://github.com/square/otto
Otto是一个在Android中的事件总线框架,它是square的一个开源框架,具体介绍点击这里,项目下载点击这里
先来看看otto的官方介绍
An enhanced Guava-based event bus with emphasis on Android support.
Otto is an event bus designed to decouple different parts of your application while still allowing them to communicate efficiently.
Forked from Guava, Otto adds unique functionality to an already refined event bus as well as specializing it to the Android platform.
otto基于Guava项目的Android支持库,如果你在Android程序开发的过程中想要不同的组件之间进行有效的通信可以使用这个库。通过otto库可以
降低程序之间的耦合性。
为什么要使用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中真正用到的就只有一个类两个注解三个方法:
Bus– 管理注册、注销和发布事件
@Produce– 标记该方法是生产者,产生的事件内容为该方法的返回值
@Subscribe– 标记该方法是订阅者,表示订阅了一个事件,方法需要修饰符为public,而区分不同的订阅者是通过方法的参数来区分的,且订阅了某事件的所有订阅者都可以收到该事件
register(Object obj)– 注册,订阅事件前都需要注册
unregister(Object obj)– 注销,放弃之前所有事件的订阅
post(Object event)– 发布一个事件,这个事件会被所有标记了@Subscribe注解的方法获得
使用Otto事件总线
首先添加依赖:
dependencies{
compile 'com.squareup:otto:+'
}
在我的项目中
compile'com.squareup:otto:1.3.5'
1、为了避免重复创建Bus对象,我们先为Bus创建一个单例对象
发布事件有两种方法:
1、使用@Produce注解来生产事件,不过它生产事件前它需要注册、生产完事件后需要注销,如果使用这种方法则在跳转到生产者所在的类中则会立即产生事件触发订阅者,即在MainActivity跳转到TestActivity时,会立即产生事件并订阅了该事件的方法会收到该事件,如:
则在MainActivity跳转到TestActivity时订阅者会马上收到事件,输出的Log信息为:
109-06 03:46:16.738 5958-5958/? V/zxy﹕ hello word!
2、通过post()来发布事件,它不需要注册和注销,而且它不会在界面跳转时马上发布事件,而是我们人为的控制该事件什么时候发布,使用如下:
当我们点击按钮时候,这个事件就发布出去了,而订阅了该事件的方法就会收到,打印的Log为:
109-06 03:46:18.738 5958-5958/? V/zxy﹕ hello word!
【注】:发布事件需要发布的是一个Object对象,而且这个对象不能为null,所以在数据量大的时候我们可以创建个Bean类,而传当个数据时候如字符串等则直接传String就好。
可以看到通过Otto事件总线来处理类与类之间的交互,可以使得我们的代码更容易理解,类与类之间也解耦了。
转载自:https://blog.csdn.net/happy_develop_/article/details/54584777