【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
文章目录
- 一、根据事件类型获取订阅者
- 二、调用订阅方法
一、根据事件类型获取订阅者
接收到了 发布者 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】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )相关推荐
- 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )
文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...
- 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )
文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 六.Activity 中测试上述框架 七.博客源码 一.消息中心 该消息中心是事件通信框架的核心代 ...
- 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )
文章目录 一.取消注册订阅者 二.完整代码示例 一.取消注册订阅者 取消注册操作 : 从 Map<Object, List<Class<?>>> typesBySu ...
- 【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
文章目录 一.注册订阅方法 二.完整代码示例 一.注册订阅方法 订阅方法注册的过程就是将 订阅方法参数类型 和 订阅类 + 订阅方法 封装类 , 保存到 Map<Class<?>, ...
- 【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )
文章目录 一.检查订阅方法缓存 二.反射获取订阅类中的订阅方法 三.完整代码示例 一.检查订阅方法缓存 注册订阅者时 , 只传入一个订阅者类对象 , 其它信息都需要通过反射获取 ; 1. 获取订阅者类 ...
- 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
文章目录 前言 一.订阅类-订阅方法缓存集合 二.事件类型-订阅者集合 三.订阅对象-事件类型集合 前言 首先声明几个数据结构 , 参考 [EventBus]EventBus 源码解析 ( 注册订阅者 ...
- 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 一.消息中心 此处暂时只实现一个单例类 , 后续 注册订阅者 , 处理事件传递 , 取消注册订阅者 ...
- Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
目录 背景 演示 搭建Java Web环境 QTcpSocket获取服务器数据 QNetworkAccessManager获取服务器数据 背景 Qt中有2个方式可以实现HTTP协议的发送,一个是使用Q ...
- php发送get、post请求获取内容的几种方法
方法1: 用file_get_contents 以get方式获取内容<?php $url='http://www.domain.com/'; $html = file_get_contents( ...
最新文章
- RunnableException与CheckedException
- git中统计代码提交数
- Python 直接赋值、浅拷贝和深度拷贝解析
- Codeforces Round #739 (Div. 3)(AK实况)
- 天地图怎么看历史图像_解密:看猪八戒是怎么由一头猪变成天蓬元帅的
- Hibernate之Criteria查询
- 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
- 谷歌推出一款72个量子比特的通用量子计算机
- 滁州2021年高考成绩查询时间,安徽2021中考时间表安排 滁州2021年中考时间考点公布...
- 【apicloud问题解决记录】键盘弹出监听处理以及头部底部的黑色闪屏现象
- 新建文本html,创建邮件模板时html内容和文本内容哪种好
- 什么无线蓝牙耳机好?英雄联盟推荐竞技游戏专用蓝牙耳机
- Django ORM模型一对一、一对多、多对多的操作详解
- 转载:ESP系统——ABS、TCS、VDC及VAF功能介绍
- 调用摄像头接口方法合集
- E 排队(排列组合)[牛客小*白月赛61]
- Vue视频流播放器 Vue-Core-Video-Player
- windows电脑系统优化
- HttpWebRequest和HttpWebResponse
- 查找(顺序查找、二分查找、插值查找)
热门文章
- Android开发总结
- Cobbler 2.4.4 安装
- Linux 的性能进行监测
- SugarCRM 主表-自定义字段
- 计算一个二进制数中数字“1”的个数(位运算)
- 我们距离AI编程还有多远?
- [LeetCode] 303. Range Sum Query - Immutable
- android5.0(Lollipop) BLE Peripheral深入理解系统篇之提高篇
- U盘从4G变为了75M 恢复U盘容量的方法
- 算法学习:后缀数组 height的求取