日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

發布時間:2025/6/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • EventBus 中的重要數據類型
    • 1、subscriptionsByEventType 集合
    • 2、typesBySubscriber 集合





EventBus 中的重要數據類型



從幾個關鍵的數據存儲結構角度分析 EventBus 注冊訂閱者過程 ;


1、subscriptionsByEventType 集合


Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType 集合

在 EventBus 中的 subscriptionsByEventType 成員變量 , 保存的是 HashMap 集合 ,

  • Key 是事件類型對象 ;
  • Value 是 Subscription 集合 , Subscription 中封裝了一個訂閱者對象和一個訂閱方法 ;
public class EventBus {private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType; }

在 EventBus.subscribe 方法中 , 獲取訂閱方法參數類型就是上述 Key 鍵 ;

// 獲取訂閱方法參數類型 , 可以是任意類型 , 自定義的 MessageEvent 消息類型Class<?> eventType = subscriberMethod.eventType;

先封裝該 訂閱者 對象 與 訂閱方法 到 Subscription 中 ,

// Subscription 中封裝了一個訂閱者對象和一個訂閱方法 Subscription newSubscription = new Subscription(subscriber, subscriberMethod);

然后從 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 成員變量中獲取 對應 消息類型 的 Subscription 集合 ;

如果發現沒有該消息類型對應的 CopyOnWriteArrayList<Subscription> 集合 , 則先創建一個集合 , 再放入到 subscriptionsByEventType 成員中 ;

然后在將新封裝的 Subscription 對象 , 放到對應的 CopyOnWriteArrayList<Subscription> 集合中 , 注意放入的時候 , 查詢是否有設置優先級屬性 , 如果有 , 按照優先級順序放置 ;

int size = subscriptions.size();for (int i = 0; i <= size; i++) {// 處理訂閱方法優先級 , 重新進行排列 if (i == size || subscriberMethod.priority > subscriptions.get(i).subscriberMethod.priority) {subscriptions.add(i, newSubscription);break;}}

這樣就完成了 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 成員的封裝工作 ;

該成員變量的作用很明顯 , 在發布者發送消息到消息中心后 , 消息中心根據傳入的消息類型 , 查找對應的 訂閱者實例對象 和 訂閱方法 , 可以直接調用對應的訂閱方法 ;


2、typesBySubscriber 集合


Map<Object, List<Class<?>>> typesBySubscriber 集合

private final Map<Object, List<Class<?>>> typesBySubscriber; 是 EventBus 的成員變量 ;

  • Key : 訂閱者對象 ;
  • Value : 訂閱方法參數類型集合 ;

可以根據訂閱者對象查詢 該訂閱者對象 中的 訂閱方法 中的參數集合 , 根據參數可以到 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中查詢對應的 訂閱者對象 和 訂閱方法 ;

該 typesBySubscriber 集合的作用很明顯 , 在取消注冊時 , 可以快速查詢到 該訂閱者對象 注冊了哪些方法 , 將其從 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 集合中移除 , 就可以達到取消訂閱的目的 ;

總結

以上是生活随笔為你收集整理的【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。