EventBus 3.0修改了以前版本用特定名称标记event接收者的方法,改用注解标示 event 接收者。
该注解为 @Subscribe.简单分析了一般流程和部分UML类图。
使用
参考 https://github.com/greenrobot/EventBus
-
Define events:
public class MessageEvent { /* Additional fields if needed */ }
-
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 */};
-
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