EventBus的粘性事件原理
生活随笔
收集整理的這篇文章主要介紹了
EventBus的粘性事件原理
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
EventBus也稱事件總線,根據(jù)發(fā)送事件的類型分為普通事件和粘性事件。
粘性事件的用法:
1.訂閱的時候加上sticky = true
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public fun onEvent() {}
2.post()改為postSticky()
EventBus.getDefault().postSticky(msgEvent)
粘性事件的原理:
事件發(fā)送時,接收方還不存在,在接收方注冊的時候去處理該事件。
1.調(diào)用postSticky,會把粘性事件先保存下來
public void postSticky(Object event) {synchronized (stickyEvents) {//1.保存粘性時間stickyEvents.put(event.getClass(), event);}//2.如果已經(jīng)注冊了,就會馬上響應(yīng),按普通事件處理post(event);
}
當(dāng)EventBus注冊時,根據(jù)注解判斷當(dāng)前方法是否是sticky,如果是的,獲取粘性事件,直接調(diào)用該訂閱方法。
public void register(Object subscriber) {//...subscribe(subscriber, subscriberMethod);
}private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {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);}}
}
checkPostStickyEventToSubscription(newSubscription, stickyEvent)方法,最終會去post事件。
總結(jié)
以上是生活随笔為你收集整理的EventBus的粘性事件原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点击事件如何传递到Activity中
- 下一篇: 协程Coroutines入门