<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);

更多相关文章

  1. design principle:模拟 android Button 控件点击事件
  2. Android 自定义属性时TypedArray的使用方法
  3. Android TV 智能电视/盒子 APP 开发焦点控制 两种方法实例
  4. android v7包 正常导入使用方法
  5. [转载]Android触屏滑动事件总结 (2011-08-08 10:14:25)
  6. 《Android 开发艺术探索》笔记——(3)View 的事件体系
  7. Could not find *****/adb.exe!的解决方法(android sdk太新了?**#

随机推荐

  1. Android之LayoutInflater
  2. View的事件体系《Android开发艺术探索》
  3. Activity的生命周期——原创
  4. xcode与eclipse整合cocos2dx
  5. android读书知识点总结
  6. android系统提供的常用命令行工具
  7. android PopupWindow模拟Windows开始菜单
  8. Android--打包工具,100个渠道包只需要10秒
  9. Android(安卓)Path详解
  10. Android中使用PULL方式解析XML和XmlSeria