前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【EventBus】EventBus 源码解析 ( 注册订阅者总结 | 从封装的数据结构角度分析 EventBus )

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

作者头像
韩曙亮
发布2023-03-29 17:45:33
2490
发布2023-03-29 17:45:33
举报

文章目录

EventBus 中的重要数据类型


从几个关键的数据存储结构角度分析 EventBus 注册订阅者过程 ;

1、subscriptionsByEventType 集合

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

在 EventBus 中的 subscriptionsByEventType 成员变量 , 保存的是 HashMap 集合 ,

  • Key 是事件类型对象 ;
  • Value 是 Subscription 集合 , Subscription 中封装了一个订阅者对象和一个订阅方法 ;
代码语言:javascript
复制
public class EventBus {
	private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
}

EventBus.subscribe 方法中 , 获取订阅方法参数类型就是上述 Key 键 ;

代码语言:javascript
复制
    	// 获取订阅方法参数类型 , 可以是任意类型 , 自定义的 MessageEvent 消息类型
        Class<?> eventType = subscriberMethod.eventType;

先封装该 订阅者 对象 与 订阅方法 到 Subscription 中 ,

代码语言:javascript
复制
        // Subscription 中封装了一个订阅者对象和一个订阅方法 
        Subscription newSubscription = new Subscription(subscriber, subscriberMethod);

然后从 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType 成员变量中获取 对应 消息类型 的 Subscription 集合 ;

如果发现没有该消息类型对应的 CopyOnWriteArrayList<Subscription> 集合 , 则先创建一个集合 , 再放入到 subscriptionsByEventType 成员中 ;

然后在将新封装的 Subscription 对象 , 放到对应的 CopyOnWriteArrayList<Subscription> 集合中 , 注意放入的时候 , 查询是否有设置优先级属性 , 如果有 , 按照优先级顺序放置 ;

代码语言:javascript
复制
        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 集合中移除 , 就可以达到取消订阅的目的 ;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • EventBus 中的重要数据类型
    • 1、subscriptionsByEventType 集合
      • 2、typesBySubscriber 集合
      相关产品与服务
      数据保险箱
      数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档