Android EventBus使用

EventBus是一款针对Android定制的[发布/订阅]事件总线。它让我们轻松的处理四大组件之间的事件传递,而且速度更快,整个包的体积也较小(只有不到50K的的大小)。
本博文将对EventBus的使用和进行解析。
PS:本文基于EventBus 3.0版本进行解析。

1. EventBus是什么?

官网给出的解释:EventBus是针对Android定制的[发布/订阅]事件总线。
下图是对其的一个简单概述:


Android EventBus使用_第1张图片
EventBus-Publish-Subscribe.png

2. 如何使用(3步)

只需要简单的三个步骤,我们便可轻松在项目中使用EventBus,下面描述如何在我们的项目中使用它。

  1. 定义事件
public static class MessageEvent { /* Additional fields if needed */ }
  1. 准备订阅者
  • 声明接收事件的注解方法
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};
  • 订阅或取消订阅(以Activity为例)
 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 } 
@Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }
  1. 发布事件
EventBus.getDefault().post(new MessageEvent());

3. 使用要点分析

在注册接收事件的方法时,使用@Subscribe注解时我们需要提供一个threadMode的参数,那么下面我们首先来分析下Subscribe注解的使用。

  • Subscribe的定义
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
    ThreadMode threadMode() default ThreadMode.POSTING;

    /**
     * If true, delivers the most recent sticky event (posted with
     * {@link EventBus#postSticky(Object)}) to this subscriber (if event available).
     */
    boolean sticky() default false;

    /** Subscriber priority to influence the order of event delivery.
     * Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before
     * others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of
     * delivery among subscribers with different {@link ThreadMode}s! */
    int priority() default 0;
}

在使用注解时我们可以提供以下参数:
* threadMode(线程运行模式)
* sticky(是否接收的是粘性事件)
* priority(接收事件的优先级)

ThreadMode

ThreadMode是一个枚举,有以下值提供:

  • POSTING
  • MAIN
  • BACKGROUND
  • ASYNC
  1. POSTING
  • 发布事件和订阅事件运行在同一个线程,这也是默认值。
  • 此时事件分发传递开销较小,因为它避免了完全线程切换。
  • 这是不需要主线程简单任务的推荐模式。
  • 使用此模式的事件处理程序必须快速返回,以避免阻塞发布线程,因为这可能是主线程。
  1. MAIN
  • 订阅者将在Android主线程中被调用。
  • 如果发布者是在主线程中发布事件,那么事件处理方法将被直接调用。
  • 事件处理方法必须快速返回,防止阻塞主线程。
  1. BACKGROUND
  • 订阅者将在后台线程中被调用。
  • 如果发布者线程不是主线程,事件处理方法将直接在发布者线程中调用。
  • 如果发布者线程是主线程,EventBus使用一个单独的后台线程,它将顺序地提供其所有的事件。
  • 使用此模式的事件处理方法应该尝试快速返回,防止阻塞后台线程。
  1. ASYNC
  • 订阅者总是在一个单独的线程中被调用。这个线程独立于主线程和发布线程。
  • 如果事件的处理为耗时操作,那么推荐使用该模式。
  • 注意限制并发数量。
  • EventBus使用线程池来解决线程重用问题。

4. 黏性事件

  1. 如何使用
//注册事件接收方法
@Subscribe(sticky = true)
public void XXX(MessageEvent messageEvent) {
    ......
}
//发送黏性事件
EventBus.getDefault().postSticky(new MessageEvent("test"));
  1. 区别

那么黏性事件与普通事件有什么区别呢?

  • 事件订阅者可接收注册前发布的黏性事件(如果存在多个,那么只能接收最近的那一个)
    其他的使用和非黏性事件相同,在此不做描述。

你可能感兴趣的:(Android EventBus使用)