【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )
文章目錄
- EventBus 中的重要數據類型
- 1、subscriptionsByEventType 集合
- 2、typesBySubscriber 集合
EventBus 中的重要數據類型
從幾個關鍵的數據存儲結構角度分析 EventBus 注冊訂閱者過程 ;
1、subscriptionsByEventType 集合
Map<Class<?>, CopyOnWriteArrayList> subscriptionsByEventType 集合
在 EventBus 中的 subscriptionsByEventType 成員變量 , 保存的是 HashMap 集合 ,
- Key 是事件類型對象 ;
- Value 是 Subscription 集合 , Subscription 中封裝了一個訂閱者對象和一個訂閱方法 ;
在 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 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【EventBus】EventBus 源
- 下一篇: 【EventBus】EventBus 源