文章目录

  • 一、根据事件类型获取订阅者
  • 二、调用订阅方法

一、根据事件类型获取订阅者


接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 ) ;

通过事件类型到 Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找相应的 订阅对象 + 订阅方法 ;

获取事件类型 :

        // 获取事件类型Class<?> eventType = event.getClass();

Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType 集合中查找事件类型对应的订阅者 ;

        // 获取事件类型对应的 订阅者 集合CopyOnWriteArrayList<MySubscription> subscriptions =subscriptionsByEventType.get(eventType);

遍历并调用订阅者 :

        // 确保订阅者大于等于 1 个if (subscriptions != null && subscriptions.size() > 0) {// 遍历订阅者并调用订阅方法for (MySubscription subscription : subscriptions) {postSingleSubscription(subscription, event);}}

部分代码示例 :

    /*** 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象*      将该事件对象转发给相应接收该类型消息的 订阅者 ( 订阅对象 + 订阅方法 )*      通过事件类型到*      Map<Class<?>, CopyOnWriteArrayList<MySubscription>> subscriptionsByEventType*      集合中查找相应的 订阅对象 + 订阅方法* @param event*/public void post(Object event) {// 获取事件类型Class<?> eventType = event.getClass();// 获取事件类型对应的 订阅者 集合CopyOnWriteArrayList<MySubscription> subscriptions =subscriptionsByEventType.get(eventType);// 确保订阅者大于等于 1 个if (subscriptions != null && subscriptions.size() > 0) {// 遍历订阅者并调用订阅方法for (MySubscription subscription : subscriptions) {postSingleSubscription(subscription, event);}}}

二、调用订阅方法


通过反射调用订阅方法 ;

MySubscription 中封装了 订阅者对象 和 订阅方法 , 订阅方法中封装了 Method 方法 ;

直接调用 Method 对象的 invoke 方法 , 通过反射调用订阅方法 , 传入的第一个参数是 订阅者对象 , 即订阅方法所在的对象 , 传入的第二个参数是 订阅方法接收的事件参数对象 ;

    /*** 调用订阅者的订阅方法* @param subscription 订阅者对象 + 订阅方法* @param event 发布者传递的消息事件*/private void invokeMethod(MySubscription subscription, Object event) {try {// 通过反射调用订阅方法subscription.getSubscriberMethod().getMethod().invoke(subscription.getSubscriber(),   // 订阅者对象event                           // 事件参数类型);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}

【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )相关推荐

  1. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  2. 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )

    文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 六.Activity 中测试上述框架 七.博客源码 一.消息中心 该消息中心是事件通信框架的核心代 ...

  3. 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )

    文章目录 一.取消注册订阅者 二.完整代码示例 一.取消注册订阅者 取消注册操作 : 从 Map<Object, List<Class<?>>> typesBySu ...

  4. 【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )

    文章目录 一.注册订阅方法 二.完整代码示例 一.注册订阅方法 订阅方法注册的过程就是将 订阅方法参数类型 和 订阅类 + 订阅方法 封装类 , 保存到 Map<Class<?>, ...

  5. 【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )

    文章目录 一.检查订阅方法缓存 二.反射获取订阅类中的订阅方法 三.完整代码示例 一.检查订阅方法缓存 注册订阅者时 , 只传入一个订阅者类对象 , 其它信息都需要通过反射获取 ; 1. 获取订阅者类 ...

  6. 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )

    文章目录 前言 一.订阅类-订阅方法缓存集合 二.事件类型-订阅者集合 三.订阅对象-事件类型集合 前言 首先声明几个数据结构 , 参考 [EventBus]EventBus 源码解析 ( 注册订阅者 ...

  7. 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )

    文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 一.消息中心 此处暂时只实现一个单例类 , 后续 注册订阅者 , 处理事件传递 , 取消注册订阅者 ...

  8. Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)

    目录 背景 演示 搭建Java Web环境 QTcpSocket获取服务器数据 QNetworkAccessManager获取服务器数据 背景 Qt中有2个方式可以实现HTTP协议的发送,一个是使用Q ...

  9. php发送get、post请求获取内容的几种方法

    方法1: 用file_get_contents 以get方式获取内容<?php $url='http://www.domain.com/'; $html = file_get_contents( ...

最新文章

  1. RunnableException与CheckedException
  2. git中统计代码提交数
  3. Python 直接赋值、浅拷贝和深度拷贝解析
  4. Codeforces Round #739 (Div. 3)(AK实况)
  5. 天地图怎么看历史图像_解密:看猪八戒是怎么由一头猪变成天蓬元帅的
  6. Hibernate之Criteria查询
  7. 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
  8. 谷歌推出一款72个量子比特的通用量子计算机
  9. 滁州2021年高考成绩查询时间,安徽2021中考时间表安排 滁州2021年中考时间考点公布...
  10. 【apicloud问题解决记录】键盘弹出监听处理以及头部底部的黑色闪屏现象
  11. 新建文本html,创建邮件模板时html内容和文本内容哪种好
  12. 什么无线蓝牙耳机好?英雄联盟推荐竞技游戏专用蓝牙耳机
  13. Django ORM模型一对一、一对多、多对多的操作详解
  14. 转载:ESP系统——ABS、TCS、VDC及VAF功能介绍
  15. 调用摄像头接口方法合集
  16. E 排队(排列组合)[牛客小*白月赛61]
  17. Vue视频流播放器 Vue-Core-Video-Player
  18. windows电脑系统优化
  19. HttpWebRequest和HttpWebResponse
  20. 查找(顺序查找、二分查找、插值查找)

热门文章

  1. Android开发总结
  2. Cobbler 2.4.4 安装
  3. Linux 的性能进行监测
  4. SugarCRM 主表-自定义字段
  5. 计算一个二进制数中数字“1”的个数(位运算)
  6. 我们距离AI编程还有多远?
  7. [LeetCode] 303. Range Sum Query - Immutable
  8. android5.0(Lollipop) BLE Peripheral深入理解系统篇之提高篇
  9. U盘从4G变为了75M 恢复U盘容量的方法
  10. 算法学习:后缀数组 height的求取