最核心的,分发事件
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
checkPostStickyEventToSubscription(newSubscription, stickyEvent);
我们跟进入看下这个方法,
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());
}
}
private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
switch (subscription.subscriberMethod.threadMode) {
case POSTING:
invokeSubscriber(subscription, event);
break;
case MAIN:
if (isMainThread) {
invokeSubscriber(subscription, event);
} else {
// 如果不是在主线程,它会通过enqueue方法,录入到队列当中
mainThreadPoster.enqueue(subscription, event);
}
break;
case MAIN_ORDERED:
if (mainThreadPoster != null) {
mainThreadPoster.enqueue(subscription, event);
} else {
// temporary: technically not correct as poster not decoupled from subscriber
invokeSubscriber(subscription, event);
}
break;
case BACKGROUND:
if (isMainThread) {
backgroundPoster.enqueue(subscription, event);
} else {
// 如果不在UI线程会调用这个
invokeSubscriber(subscription, event);
}
break;
case ASYNC:
// 不管是否在主线程都会添加到这个队列当中
asyncPoster.enqueue(subscription, event);
break;
default:
throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode);
}
}
本文深入探讨了EventBus中的事件分发机制,特别是sticky事件的处理方式。针对不同线程模式下的事件传递流程进行了详细解释,并展示了如何根据不同场景选择合适的事件处理策略。
2706

被折叠的 条评论
为什么被折叠?



