Otto是Square推出的基于Guava项目的Android支持库,otto是一个事件总线,用于应用程序的不同组件之间进行有效的通信。OTTO是基于Observer的设计模式。它有发布者,订阅者这两个主要对象。OTTO的最佳实践就是通过反射牺牲了微小的性能,同时极大的降低了程序的耦合度。
Otto官网: http://square.github.io/otto/
目的
Otto框架的主要功能是帮助我们来降低多个组件通信之间的耦合度(解耦)。
应用场景
比如:由界面A跳转至界面B,然后点击B中的Button发送消息更新界面A的视图;
比如:界面有一个界面A,A里面有个Fragment,点击Fragment中的一个Button,跳转至界面B,点击界面B的Button来更新界面A的Fragment视图,等等。
上面列出的两种场景,以前可以用startActivityForResult和interface的方式实现的话会比较麻烦,并且产生了很多的状态判断和逻辑判断,并且可能产生很多不必要的bug,代码量也比较大和繁琐,使用Otto就可以容易的避免这些问题。
基本用法实例
添加Otto
|
|
实现一个Bus的单例
|
|
自定义一个Event事件,封装消息
|
|
MainActivity,订阅事件
|
|
@Subscrible这个注解在调用了register之后有效,表示订阅一个事件,并且方法用public修饰,方法名可以任意取,参数为自定义的事件类,Otto根据事件对象的类名来判断和处理对应的事件。
BActivity发送订阅事件
|
|
@Produce注解告诉Bus该函数是一个事件产生者,产生的事件类型为该函数的返回值。
结果
点击BActivity中的按钮发送消息,然后返回至MainActivity中,打印如下:
|
|
结果说明:@Subscrible注解的消息处理函数时根据事件对象的类名来确定事件类型,这里的两个方法的参数都是EventFirst类型,所以两个方法都处理了EventFirst事件消息。
总结
通过例子我们可以发现,其实事件发布者不用@Produce注解和注册事件也可以发布消息。但是你要Subscribe订阅事件就一定要register这个类了,否则是接受不到事件的。