Otto与EventBus框架比较

原创 2015年11月19日 19:01:40

最近这几天经常在空闲时间看到了AOP编程,其实也就是对面向事件过程编程,一开始一直很难理解这个名次。不过看到Android正好有面向事件编程,程序解藕的开源库(Otto,EventBus)。所以闲暇时间就去看了一下这两个库的源码,写篇博客记录一下。其实很多时候,沉下心去做一件事就好了,收获会伴随着的。

用法

首先从用法上面来说,两个框架的用法本质上其实是差不多的:注册(register),发布事件(post),接收事件(onEvent…),事件类,取消注册(unregister)。两个框架都包含这几样东西。另外Otto有个不同点是Otto有个Produce,生成事件的函数。它们的事件都包含sticky事件。下面分别介绍两个简单的使用API。

Otto

public class TestActivity extends Activity{

    public static class TestEvent{
    }

    public void onCreate(Bundle b){
        /*...*/

        final Bus bus = new Bus();
        bus.register(this)
        findViewById(R.id.testpost).setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                bus.post(new TestEvent());  //发布事件,消息
            }
        }
    }

    @Subscribe public void onTestEvent(TestEvent event){
        // TODO process the event.响应TestEvent发出的时候,@Subscribe注释标记订阅。
    }

    @Produce public TestEvent produceAnswer(){
        // Produce 表示产生事件
        return new TestEvent();
    }
}

EventBus

public class TestActivity extends Activity{

    public static class TestEvent{
    }

    public void onCreate(Bundle b){
        /*...*/

        final EventBus bus = EventBus.getDefault();
        bus.register(this);
        findViewById(R.id.testpost).setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                bus.post(new TestEvent());  //发布事件,消息
            }
        }
    }

    public void onEvent(TestEvent event){
        // 以onEvent开头就是接受事件,订阅
    }
}

上面仅仅是范例性的展示,除了这个简单的使用外,在Android比较关键的就是UI线程跟普通的线程。Otto会将处理的线程跟发送的线程保持一致,你也可以自己设置线程,Bus提供了一个那样的参数。而EventBus则可以自己指定线程,有四种方式,可以在onEvent后面加个后缀。比如:onEventMainThread。

另外一方面,EventBus也是提供了一个默认的单例EventBus(EventBus.getDefault())。我觉得这样能够更加方便地在Activity和Activity,Activity和Fragment解藕。

框架流程

本身这两个框架都不是很大,其核心代码都在接口类里面(Bus,EventBus)。这里就用流程的方式表示其具体结构。

Otto的框架流程

Otto

EventBus流程

EventBus

需要特别指出的是。
1. Otto的订阅者运行的线程跟跟发送的线程是一致的,但是EventBus的会根据用户声明订阅的函数的时候指定的线程来去运行。
2. Otto只会查找当前类中的订阅者,跟Produce。但是EventBus会查找父类的订阅者。在post的时候,两个框架都会去查找Event的父类型,毕竟Event也是属于它的父类型类型。
3. 两个框架都采用了很多缓存,比如查找订阅者的时候。事件与对应的订阅者也是缓存着的。

个人看法

如果从源码上来看,两个框架都是比较简单的框架,代码量都比较小。使用起来的话,我觉得EventBus会更加适用一点。但是Otto更加简洁。

这两个框架通过事件驱动来将Activity,Fragment解藕。但是如果在一个Activity内部使用的话,我觉得效果可能不是很好,这个框架目的在于Android组件之间的解藕。

另外两种框架都是使用了一种先解析将订阅者缓存起来,提高查找速度。这个策略在其他的框架中也是使用的非常多。

EventBus & Otto的使用和比较

EventBus主要用来消息/事件的传递,却能实现组建之间的解耦。对比其他的消息传递: 使用监听器接口(Listener Interface): 1、一个实现了监听器接口的类,必须把它自身注册到它...
  • ChatHello
  • ChatHello
  • 2017年04月05日 08:42
  • 310

EventBus与Rxandroid之间的比较

EventBus比较适合仅仅当做组件间的通讯工具使用,主要用来传递消息。使用EventBus可以避免搞出一大推的interface,仅仅是为了实现组件间的通讯,而不得不去实现那一推的接口。 RxJa...
  • lgzaaron
  • lgzaaron
  • 2016年06月29日 11:00
  • 2812

OttoVSEventBus

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

用RxBus替代EventBus、Otto

RxJava已经渐渐走进了程序员的日常生活,用习惯了EventBus的Coder哥决定用Rxjava的思想来实现一个Rxbus,用于替代EventBus。闲话少说,直接上代码,欢迎批评指正...
  • limonzet
  • limonzet
  • 2016年09月20日 10:26
  • 744

EventBus与Rxandroid之间的比较

EventBus比较适合仅仅当做组件间的通讯工具使用,主要用来传递消息。使用EventBus可以避免搞出一大推的interface,仅仅是为了实现组件间的通讯,而不得不去实现那一推的接口。 RxJa...
  • lgzaaron
  • lgzaaron
  • 2016年06月29日 11:00
  • 2812

EventBus & Otto的使用和比较

EventBus主要用来消息/事件的传递,却能实现组建之间的解耦。对比其他的消息传递: 使用监听器接口(Listener Interface): 1、一个实现了监听器接口的类,必须把它自身注册到它...
  • ChatHello
  • ChatHello
  • 2017年04月05日 08:42
  • 310

【FastDev4Android框架开发】消息总线EventBus源码分析以及与Otto框架对比(二十一)

(一).前言:             上一篇我们对EventBus的简介和基本使用做了说明,今天我们主要深入的使用EventBus,同时会从源码的角度对于订阅和发送消息做分析,以及和另外的消息总线框...
  • jiangqq781931404
  • jiangqq781931404
  • 2015年11月04日 16:55
  • 2793

Android Otto框架浅析

Otto 事件总线-- Android开源框架,用于解耦!
  • u011133213
  • u011133213
  • 2014年07月12日 17:12
  • 10770

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

一、Otto介绍 OTTO是Square推出的库,地址:https://github.com/square/otto 先来看看otto的官方介绍 An enhanced Guava-based eve...
  • zhangweiwtmdbf
  • zhangweiwtmdbf
  • 2015年10月13日 13:28
  • 16115

Otto使用入门

Android事件库Otto入门介绍
  • lzyzsd
  • lzyzsd
  • 2014年12月19日 00:09
  • 19040
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Otto与EventBus框架比较
举报原因:
原因补充:

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