<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在Android中的各个组件之前有时候经常需要相互访问,我们很多时候可能使用的是实现接口的方式来的,但是这样做耦合性太强了,当量大了的时候,不便于维护和扩展。这个时候可以使用事件总线的机制来实现并解耦,Otto就是Android中的事件总线机制。下面简单介绍一下Otto。</span>
Otto官网地址:http://square.github.io/otto/
Github地址:https://github.com/square/otto
Otto是Android上的一种增强的事件总线,提取自Guaua,用于Android各个部分之间相互关联,并且高度解耦。
使用:
1.创建事件总线。
Bus bus = new Bus();
默认的构造方法,创建的事件总线,是基于主线程的,也就是说,这个时候的执行全部是在主线程中执行的。也可以创建一个基于其它线程的事件总线:
Bus bus = new Bus(ThreadEnforcer.ANY);
2.事件发布:
事件发布是总线中最重要的部分,因为它允许您告诉用户一个动作已经发生。任何类别的实例可在总线上发布,并且只会被发送到该类型的订阅服务器上。
bus.post(produceLocationEvent());
同时注意:事件发布是同步的。
3.订阅:
订阅是事件发布的补充,它可以让您收到事件已发生的通知。订阅事件,用@Subscribe注释方法。该方法只需要一个单一的参数,该参数就是需要订阅的事件类型。
@Subscribe
public void onLocationCleared(LocationClearEvent event) {
// 接收到事件通知后,应该做的处理
}
方法名是任意的。使用@Subscribe注释,单一参数,方法使用public修饰。为了接收到事件通知,一个实例类,需要注册事件。如果当前类订阅了事件,可以这样写:
bus.register(this);
不像Guaua事件总线,Otto不会遍历类的层次和从已经注释的类或接口添加方法。这是一个明确的设计决策,以提高性能的库,以及保持您的代码简单和明确。记得在合适的时候调用unregister()方法。
4.生产:
使用@Produce注释方法,创建生产者。该方法不应采取任何参数,其返回类型将被用作事件的类型,它可以产生初始值。
@Produce public LocationChangedEvent produceLocationEvent() {
// Provide an initial value for location based on the last known position.
return new LocationChangedEvent(lastLatitude, lastLongitude);
}
跟订阅一样,也需要注册:
bus.register(this);