android最佳实践5:EventBus

学习EventBus的使用

介绍EventBus

为什么要使用EventBus呢?

当我们的Fragment过多的时候,组件之间传递信息会变得异常繁琐,单例不是很好的解决方案,通常我们会使用观察者模式来解决这个问题。EventBus就是一个很不错的观察者模式框架。

EventBus实现了什么?

主要用于事件的发布和订阅。EventBus定义:是一个发布 / 订阅的事件总线。
包含4个成分

  • Publisher:发布者
  • Subscriber:订阅者
  • Event:事件,Event可以是任何类型的对象
  • 总线。

那么这四者的关系是什么呢?很明显:订阅者订阅事件到总线,发送者发布事件。

订阅者Subscriber

在EventBus中,使用约定来指定事件订阅者以简化使用。即所有事件订阅都都是以onEvent开头的函数,具体来说

  • onEvent 它和ThreadModel中的PostThread对应,这个也是默认的类型,当使用这种类型时,回调函数和发起事件的函数会在同一个线程中执行,所以事件处理时间不应太长
  • onEventMainThread 它和ThreadModel中的MainThread对应,当使用这种类型时,回调函数会在主线程中执行,这个在Android中非常有用,因为在Android中禁止在子线程中更新UI。处理时间也不能太长。
  • onEventBackgroundThread 当使用这种类型时,如果事件发起函数在主线程中执行,那么回调函数另启动一个子线程,如果事件发起函数在子线程执行,那么回调函数就在这个子线程执行
  • onEventBusAsync 当使用这种类型时,不管事件发起函数在哪里执行,都会另起一个线程去执行回调,但最好限制线程的数目。

发布者Publisher

可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法,可以自己实例化EventBus对象,但一般使用默认的单例就好了:EventBus.getDefault().post(Object),根据post函数参数的类型,会自动调用订阅相应类型事件的函数。

使用EventBus

引入依赖

编辑app的build.gradle

1
compile 'org.greenrobot:eventbus:3.0.0'

简单使用步骤

  1. 定义事件类型

    1
    2
    public class MyEvents {
    }
  2. 在订阅者类里,新建事件处理方法

    1
    2
    3
    4
    @Subscribe
    public void onEventMainThread(MyEvent events){

    }

千万别忘记写@Subscribe注解了,详情见EventBus 注册错误no public methods with the @Subscribe annotation

  1. 注册订阅者,在构造函数或onCreate(Bundle savedInstanceState)

    1
    EventBus.getDefault().register(this);
  2. 取消订阅者,在onDestory()方法

    1
    EventBus.getDefault().unregister(this);
  3. 发送事件,可以在任意方法,线程

1
EventBus.getDefault().post(new MyEvent());

参考文献

AngelDevil的快速Android开发系列通信篇之EventBus
Android EventBus实战 没听过你就out了
Android中开源库EventBus使用详解