# 1.实现订阅者类
public class SampleSubscriber {
public void onEvent(Event event) {
// do something while on event occur
}
}
# 2.初始化一个EventBus
EventBus.getDefault();
# 3.注册订阅者 (subscribe)
EventBus.getDefault().register(new SampleSubscriber());
List<SubscriberMethod> SubscriberMethodFinder.findSubscriberMethods(Class<?> subscriberClass)
SubscriberMethod:
包含订阅者Method引用,消息类型Class,线程模式枚举变量
遍历上句中的列Method列表进行注册
EventBus.subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority)
存储消息类型与订阅的映射 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType
subscriptions = new CopyOnWriteArrayList<Subscription>();
subscriptionsByEventType.put(eventType, subscriptions);
根据订阅的优先级添加新订阅
int size = subscriptions.size();
for (int i = 0; i <= size; i++) {
if (i == size || newSubscription.priority > subscriptions.get(i).priority) {
subscriptions.add(i, newSubscription);
break;
}
}
存储订阅者与消息类型的映射Map<Object, List<Class<?>>> typesBySubscriber
List<Class<?>> subscribedEvents = typesBySubscriber.get(subscriber);
if (subscribedEvents == null) {
subscribedEvents = new ArrayList<Class<?>>();
typesBySubscriber.put(subscriber, subscribedEvents);
}
subscribedEvents.add(eventType);
Map<Class<?>, Object> stickyEvents
最后判断是否是针对sticky消息的订阅者,并且有sticky的该类型的消息存在,则完成注册后直接检查是否队列中有该消息,有则直接向该订阅者发送消息
4.发布信息 (post)
分为四种
PostThread
MainThread
BackgroundThread
Async
处理堆栈
取出消息队列,并从消息队列中取出事件,将事件与当前的postState一起交给postSingleEvent处理
EventBus.postSingleEvent(Object event, PostingThreadState postingState)
该方法中处理是否有继承关系
EventBus.postSingleEventForEventType(Object event, PostingThreadState postingState, Class<?> eventClass)
该方法中根据事件取得对应的订阅者
EventBus.postToSubscription(Subscription subscription, Object event, boolean isMainThread)
该方法中根据postState判断onEvent所在的线程类型
EventBus.invokeSubscriber(Subscription subscription, Object event)
该方法做最终的调用处理
除PostThread类型或PostThread就是MainThread/BackgroundThread外,其他三种都由各自的Poster完成
# 3种Poster
mainThreadPoster由HandlerPoster完成功能,继承自Handler
backgroundPoster和asyncPoster都通过实现Runnable完成功能backgroundPoster是asyncPoster的一种特殊形式,是一个单一的队列。
asyncPoster则可能有多个同时执行