Otto介绍

转载 2013年12月05日 20:31:04

Otto 是Android系统的一个Event Bus模式类库。用来简化应用组件间的通信。关于Event Bus模式的详细情况,请参考这里

Otto的使用是比较简单的,先到项目主页下载源码:https://github.com/square/otto

下载后的源码目录中包含一个library和sample目录, library目录是类库源代码;sample目录是示例代码。

主要使用com.squareup.otto.Bus类、@Produce、 @Subscribe 注解。

在组件的相关生命周期中通过Bus类的register 函数来注册,然后Bus类会扫描改类中带有@Produce和 @Subscribe 注解的函数。

@Subscribe 注解告诉Bus该函数订阅了一个事件,该事件的类型为该函数的参数类型;而@Produce注解告诉Bus该函数是一个事件产生者,产生的事件类型为该函数的返回值。

可以在Activity或者Fragment的onResume函数中注册监听器;在onPause函数中取消注册:

  @Override protected void onResume() {
    super.onResume();

    // Register outselves so that we can provide the initial value.
    BusProvider.getInstance().register(this);
  }

  @Override protected void onPause() {
    super.onPause();

    // Always unregister when an object no longer should be on the bus.
    BusProvider.getInstance().unregister(this);
  }

对于在前面文章中介绍的场景,可以定义一个位置产生函数:

  @Produce public LocationChangedEvent produceLocationEvent() {
    // Provide an initial value for location based on the last known position.
    return new LocationChangedEvent(lastLatitude, lastLongitude);
  }

该函数的@Produce注解告诉Bus该函数可以产生一个类型为LocationChangedEvent的事件,当有该类型的事件向Bus注册的时候, Bus会调用该函数获取初始值,并使用该值来调用订阅该事件的函数。

而对于需要订阅该事件的地方,通过@Subscribe注解来告诉Bus:

  @Subscribe public void onLocationChanged(LocationChangedEvent event) {
    locationEvents.add(0, event.toString());
    if (adapter != null) {
      adapter.notifyDataSetChanged();
    }
  }

需要注意的是,不管是生产者还是订阅者都需要向Bus注册自己:

bus.register(this);

如果您认为在每个Activity或者Fragment的onResume和onPause函数中都需要调用bus.register(this)和bus.unregister(this)函数比较麻烦的话,可以通过一个Bus包装类来自动
完成注册的工作,然后在您的类中只需要继承基类,并调用函数getScopedBus().register(…) 来注册需要的对象即可。详细情况参考示例代码:https://gist.github.com/3057437

执行线程

Otto的事件调用默认是在主线程(应用的UI线程)中调用,

// 下面两种声明方式是一样的效果.
Bus bus1 = new Bus();
Bus bus2 = new Bus(ThreadEnforcer.MAIN);

如果您不关注在那个线程中执行事件函数,则可以通过 ThreadEnforcer.ANY 参数来初始化Bus对象,

如果上面2个线程控制方式满足不了您的需求,您还可以通过实现ThreadEnforcer接口来定义自己的线程模型、

或者使用EventBus类库,我们将在下一篇文章中介绍EventBus和Otto的区别。

本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=450



Read more: http://blog.chengyunfeng.com/?p=450#ixzz2mbSOkNrD

Otto事件总线框架的使用(一)

Otto是Square提供的一个Android事件总线框架,具体介绍点击这里,项目下载点击这里 一、使用Otto事件总线框架的原因 1.一般情况下,在Android中的Activity与Activit...

Android Otto框架浅析

Otto 事件总线-- Android开源框架,用于解耦!

OttoVSEventBus

OTTO是Square推出的基于Guava项目的Android支持库,otto是一个事件总线,用于应用程序的不同组件之间进行有效的通信。OTTO是基于Observer的设计模式。它有发布者,订阅者这两...

Android 事件总线Otto使用入门一

EventBus是一个Android端优化的事件总线,简化了应用程序内各组件间、组件与后台线程间的通信。 作为一个消息总线,有三个主要的元素: Event:事件Subscriber:事件订阅者,接...

Android 事件总线OTTO用法快速入门

一、Otto介绍 OTTO是Square推出的库,地址:https://github.com/square/otto 先来看看otto的官方介绍 An enhanced Guava-based eve...

Otto使用入门

Android事件库Otto入门介绍
  • lzyzsd
  • lzyzsd
  • 2014年12月19日 00:09
  • 18877

Android Otto框架浅析

今天要介绍的是一个Android中使用得比较多的android 事件总线 EventBus模式的一个框架Otto。 Otto 官网:http://square.github.io/otto/...
  • sbvfhp
  • sbvfhp
  • 2015年04月12日 10:42
  • 904

Android组件间通信机解耦——Android EventBus和Otto框架一、前言 传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之

一、前言 传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅...
  • sbvfhp
  • sbvfhp
  • 2015年04月12日 10:35
  • 1505

Otto的封装使用

OTTO 8/25/2016 2:39:33 PM OTTO是Square推出的基于Guava项目的Android支持库,otto是一个事件总线,用于应用程序的不同组件之间进行有效的通...

Android组件间通信机解耦——Android EventBus和Otto框架

传统的事件传递方式包括:Handler、BroadCastReceiver、Interface 回调,相比之下 EventBus 的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦。 EventB...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Otto介绍
举报原因:
原因补充:

(最多只允许输入30个字)