EventBus第三章:事件的发送,调用和解绑
该篇我将继续讲解EventBus事件发送,调用和解绑,接下来进入今天的源码解析之路。
EventBus的发送
EventBus.getDefault().post(new TestEvent("hello Eventbus"));
EventBus.getDefault().postSticky(new TestEvent("hello sticky Eventbus"));
EventBus发送事件有两种方式,分别为post和postSticky,首先从post开始:
/** Posts the given event to the event bus. */
/**
*发送事件第一步:发布给定的事件到事件总线
*/
public void post(Object event) {
//获得一个PostingThreadState对象
PostingThreadState postingState = currentPostingThreadState.get();
List<Object> eventQueue = postingState.eventQueue;
eventQueue.add(event);
if (!postingState.isPosting) {
postingState.isMainThread = isMainThread();
postingState.isPosting = true;
if (postingState.canceled) {
throw new EventBusException("Internal error. Abort state was not reset");
}
try {
while (!eventQueue.isEmpty()) {
postSingleEvent(eventQueue.remove(0), postingState);
}
} finally {
//重置一些参数
postingState.isPosting = false;
postingState.isMainThread = false;
}
}
}
通过ThreadLocal.get()获取一个PostingThreadState对象,PostingThreadState是EventBus的一个内部类,用来判断一些订阅的操作,比如是否发送,是否在主线程等。调用eventQueue.add(event)将事件添加到集合中,postingState.isPosting判读该事件是否已经发送,若没有则继续执行,若集合不为null,则执行postSingleEvent方法,传递事件和postingState对象。finnally中对postingState对象的参数进行重置,对象进行重用。
/**
*发送事件第二步:循环遍历订阅参数及其超类添加到集合中
*/
private void postSingleEvent(Object event, PostingThreadState postingState) throws Error {
//获取订阅方法参数类型
Class<?> eventClass = event.getClass