EventBus 3.0详解

来源:互联网 发布:88读书网软件 编辑:程序博客网 时间:2024/06/05 15:22

EventBus 3.0修改了以前版本用特定名称标记event接收者的方法,改用注解标示 event 接收者。

该注解为 @Subscribe.简单分析了一般流程和部分UML类图。


使用 

         参考 https://github.com/greenrobot/EventBus 

  1. Define events:

    public class MessageEvent { /* Additional fields if needed */ }
  2. Prepare subscribers: Register your subscriber (in your onCreate or in a constructor):

    eventBus.register(this);

    Declare your subscribing method:

    @Subscribe  public void onEvent(AnyEventType event) {/* Do something */};
  3. Post events:

    eventBus.post(event);

原理

    订阅类(Subscriber)和方法(Method),以及事件( Event)的封装。

Subscriber指的是接收事件的类,比如 EventBus.getDefault().register(this) 中 this 对象对应的类。

        读取 注解 @Subscribe 对应的信息,将该方法(Method对象)封装成:SubscribeMethod.

        将Subscriber 和 SubscribeMethod 封装成 Subscription类。

        具体封装见 图1


    subscriber, method, event 在 EventBus 中map的维护。

        在  EventBus 中维护着两个重要的map: 

        

    private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;    private final Map<Object, List<Class<?>>> typesBySubscriber;
         subscriptionsByEventType, key 为 eventtype对应的class, entry  为该event的接收者对应的List。

         typesBySubscriber, key 为接收 event 对应的类(Subscriber,即register(this)中的this),entry为该类所接受的事件List(event)


    接收事件的方法的线程(ThreadMode)

        ThreadMode内容可以从注解 Subscribe 读取。有四种mode:

public enum ThreadMode {    POSTING, // 订阅方法在当前线程执行    MAIN, // 订阅方法在主线程之行    BACKGROUND, // 订阅方法在后台线程执行,分2中情况:1是post线程为主线程2 post线程不为主线程    ASYNC // 新建线程处理该事件}


图解


图 1

0 0
原创粉丝点击