EventBus的粘性特征,我之前并没有看过它的流程代码,以为会略微复杂一点,今天看一下,发现原来是我想多了,真的是简单到没必要说的那种,不过毕竟之前说了之后来讲,那就简单说一下吧。
关于粘性特征,从以下几个地方去说:postSticky,register
postSticky
我们看一下这个方法的源码
public void postSticky(Object event) {
synchronized (stickyEvents) {
stickyEvents.put(event.getClass(), event);
}
// Should be posted after it is putted, in case the subscriber wants to remove immediately
post(event);
}
把粘性的事件,存放到了stickyEvents中。然后调用post方法,这个方法在EventBus源码---post流程分析说过,就是发送事件的操作,也就是说,粘性事件和普通事件一样,都发送事件出去。
postSticky之后,就到了register操作,我们看一下register中关于sticky的处理
register
我们查看subscribe方法中的一段代码
if (subscriberMethod.sticky) {
if (eventInheritance) {
Set<Map.Entry<Class<?>, Object>> entries = stickyEvents.entrySet();
for (Map.Entry<Class<?>, Object> entry : entries) {
Class<?> candidateEventType = entry.getKey();
if (eventType.isAssignableFrom(candidateEventType)) {
Object stickyEvent = entry.getValue();
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
}
}
} else {
Object stickyEvent = stickyEvents.get(eventType);
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
}
}
如果@Subscribe中设置了sticky属性,那么会执行上面的代码。首先先判断eventInheritance属性,这个属性在EventBus源码---post流程分析也说过,作用一样,我就不再这里赘述了。我们直接进入checkPostStickyEventToSubscription方法
private void checkPostStickyEventToSubscription(Subscription newSubscription, Object stickyEvent) {
if (stickyEvent != null) {
// If the subscriber is trying to abort the event, it will fail (event is not tracked in posting state)
// --> Strange corner case, which we don't take care of here.
postToSubscription(newSubscription, stickyEvent, isMainThread());
}
}
postToSubscription方法大家应该不陌生,在post方法调用的时候这个方法有被调用。而粘性事件,在register的时候就已经把事件发送出去了。
其实以上就是粘性事件的代码了,很简单,思想也不难,有问题欢迎留言~