【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
文章目錄
- 前言
- 一、訂閱類-訂閱方法緩存集合
- 二、事件類型-訂閱者集合
- 三、訂閱對象-事件類型集合
前言
首先聲明幾個數據結構 , 參考 【EventBus】EventBus 源碼解析 ( 注冊訂閱者總結 | 從封裝的數據結構角度分析 EventBus ) 博客 , 仿 EventBus , 設置幾個重要的集合 ;
一、訂閱類-訂閱方法緩存集合
METHOD_CACHE 作用僅用于作為訂閱方法的緩存類 ,
- Key - 訂閱類類型 ;
- Value - 訂閱方法 MySubscriberMethod 的集合 ;
每個類可能會創建多個對象 , 當第一個對象注冊后 , 就將該類類型與類中的訂閱方法 , 都緩存到該 Map<Class<?>, List<MySubscriberMethod>> METHOD_CACHE 集合中 , 這樣在注冊相同類型的對象時 , 就不需要再次解析該類的所有方法了 ;
每個類只需要反射解析一次即可 ;
如果解析的訂閱者類很大 , 開銷也很大 , 比如 Activity 這種重量級的類 , 其中有幾百個方法 , 如果注冊幾百個 Activity , 性能消耗還是很客觀的 ;
/*** 方法緩存* Key - 訂閱類類型* Value - 訂閱方法 MySubscriberMethod 的集合* 取名與 EventBus 一致*/private static final Map<Class<?>, List<MySubscriberMethod>> METHOD_CACHE = new HashMap<>();二、事件類型-訂閱者集合
事件類型-訂閱者集合 : Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType ;
- Key - 訂閱者方法事件參數類型 ;
- Value - 封裝 訂閱者對象 與 訂閱方法 的 MySubscription 集合 ;
在構造函數中初始化該集合 ;
CopyOnWriteArrayList 在寫入數據時會拷貝一個副本 , 寫完之后 , 將引用指向新的副本 , 該集合的線程安全級別很高 ;
該集合的重要作用就是進行消息轉發 , 通過 post 傳遞進來一個消息對象 , 該消息對象的類型 就是 訂閱者方法事件參數類型 , 通過調用 subscriptionsByEventType.get() 方法 , 可以獲取到一個CopyOnWriteArrayList<MySubscription>> 集合 , 該集合中的元素 MySubscription 對象就是 接收該類型消息的 訂閱者對象 + 訂閱方法 的封裝類 ;
/*** Key - 訂閱者方法事件參數類型* Value - 封裝 訂閱者對象 與 訂閱方法 的 MySubscription 集合* 在構造函數中初始化* CopyOnWriteArrayList 在寫入數據時會拷貝一個副本 ,* 寫完之后 , 將引用指向新的副本 ,* 該集合的線程安全級別很高*/private final Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType;三、訂閱對象-事件類型集合
訂閱對象-事件類型集合 : Map<Object, List<Class<?>>> typesBySubscriber ;
- Key - 訂閱者對象 ;
- Value - 訂閱者對象中所有的訂閱方法的事件參數類型集合 ;
在注冊時 , 設置該對象對應的訂閱方法接收的事件類型 , 在取消注冊時 , 可以根據該訂閱者對象 , 查找所有訂閱方法的事件參數類型 , 然后再到 METHOD_CACHE 中 , 根據事件參數類型 , 查找對應的 MySubscription 集合 , 從而找到 MySubscription 中封裝 訂閱者對象 + 訂閱方法 ;
/*** 解除注冊時使用* Key - 訂閱者對象* Value - 訂閱者對象中所有的訂閱方法的事件參數類型集合** 根據該訂閱者對象 , 查找所有訂閱方法的事件參數類型 , 然后再到 METHOD_CACHE 中 ,* 根據事件參數類型 , 查找對應的 MySubscriberMethod 集合* MySubscriberMethod 中封裝 訂閱者對象 + 訂閱方法**/private final Map<Object, List<Class<?>>> typesBySubscriber;Lsn09 01:45:42
總結
以上是生活随笔為你收集整理的【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【EventBus】事件通信框架 ( 实
- 下一篇: 【EventBus】事件通信框架 ( 订