文章目录

  • 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 )相关推荐

  1. 【EventBus】EventBus 源码解析 ( 注册订阅者 | 注册订阅方法详细过程 )

    文章目录 前言 一.EventBus 注册订阅者 二.注册订阅方法的具体过程 三.Subscription 类 前言 在上一篇博客 [EventBus]EventBus 源码解析 ( 注册订阅者 | ...

  2. 【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )

    文章目录 一.EventBus 注册订阅者 二.订阅方法 三.查找订阅方法 findSubscriberMethods 方法 四.查找订阅方法 findUsingInfo 方法 五.查找订阅方法 fi ...

  3. 【EventBus】EventBus 源码解析 ( 注册订阅者总结 | EventBus 注册订阅者流程梳理 )

    文章目录 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 EventBus 注册订阅者流程梳理 : ① 在 客户端 调用 EventBus.getDefault().reg ...

  4. 【EventBus】EventBus 源码解析 ( 取消订阅 )

    文章目录 一.取消订阅 二.取消订阅 unsubscribeByEventType 方法 一.取消订阅 [EventBus]EventBus 使用示例 ( 最简单的 EventBus 示例 ) 示例中 ...

  5. Android 源码分析之 EventBus 的源码解析

    1.EventBus 的使用 1.1 EventBus 简介 EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus. ...

  6. Android之EventBus框架源码解析上(单例模式)

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分 ...

  7. Dubbo源码解析 —— Zookeeper 订阅

    作者:肥朝 原文地址:https://www.jianshu.com/p/73224a6c07bb 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友 ...

  8. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

  9. Android之EventBus框架源码解析下(源码解析)

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 EventBus是典型的发布订阅模式,多个订阅者可以订阅某个事件,发布者通过 ...

最新文章

  1. 成功解决Docker Desktop requires Windows 10 Pro or Enterprise version 15063 to run.
  2. shell脚本初体验
  3. Python 竟能绘制如此酷炫的三维图
  4. keepalived架设简单高可用的nginx的web服务器   ----那些你不知道的秘密
  5. 鸿蒙造化什么意思,大家说鸿蒙造化决,和鸿蒙天地有关系吗
  6. 分布式系统设计模式(荣耀典藏版)
  7. 怎样保存CAD图纸到电脑桌面呢?
  8. 老王教您怎么做cass7.1 8.0 9.1所有系列的复制狗 加密狗 破解狗
  9. ssb门限_ssb单边带的产生方法
  10. cp -r命令 linux什么意思,linux命令 $- 是什么意思
  11. ☆【容斥原理】【SCOI2010】幸运数字
  12. 超微服务器 通电自动启动,让主板一通电就自动开机的方法
  13. TortoiseGit assume-unchanged的文件怎么恢复
  14. [转] 公共DNS,114.114.114.114和8.8.8.8
  15. 商务智能-第六章 数据挖掘
  16. cmd操作MySQL 多表查询(日记 day 4)
  17. Poly-encoder
  18. 20172323 2017-2018-2 《程序设计与数据结构》第九周学习总结
  19. 区块链与数字货币之间的关系
  20. CSDN图片去掉水印

热门文章

  1. 关于使用AIR开发移动APP 的技术解决方案 笔记
  2. ZJU PAT 1027 Colors in Mars
  3. android 实现模拟加载中的程序
  4. mysql查看数据库命令
  5. SqlServer2005高效分页sql查询语句汇总
  6. Oracle11g R2学习系列 之六数据库链接,快照及序列
  7. ATO/MTO类机械制造业特点以及ERP需求分析(三)
  8. 01 Python基础学习
  9. Codeforces Round #555 (Div. 3) AB
  10. Java多线程的几种实现方法