【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
文章目录
- 一、消息中心
- 二、订阅方法时的注解
- 三、订阅方法封装
- 四、订阅对象-方法封装
- 五、线程模式
一、消息中心
此处暂时只实现一个单例类 , 后续 注册订阅者 , 处理事件传递 , 取消注册订阅者 , 等功能在该单例类的基础上扩展 ;
package com.eventbus_demo.myeventbus;public class MyEventBus {/*** 全局单例*/private static MyEventBus instance;private MyEventBus() {}public static MyEventBus getInstance() {if (instance == null) {instance = new MyEventBus();}return instance;}}
二、订阅方法时的注解
定义一个注解 , 该注解用于修饰方法 ElementType.METHOD
, 在运行时 , 用户调用 register 注册订阅者时 , 会分析哪个方法中存在该注解 , 将有注解的方法保存起来 , 以便之后的调用 ;
该注解需要保存到运行时 RetentionPolicy.RUNTIME
;
package com.eventbus_demo.myeventbus;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) // 该注解保留到运行时
@Target(ElementType.METHOD) // 该注解作用于方法
public @interface MySubscribe {/*** 注解属性, 设置线程模式, 默认是 POSTING,* 即在发布线程调用订阅方法* @return*/MyThreadMode threadMode() default MyThreadMode.POSTING;
}
三、订阅方法封装
将 订阅方法 , 订阅方法的线程模式 , 订阅方法接收的事件类型 , 封装到类中 ;
package com.eventbus_demo.myeventbus;import java.lang.reflect.Method;/*** 该类中用于保存订阅方法相关信息*/
public class MySubscriberMethod {/*** 订阅方法*/private final Method method;/*** 订阅方法的线程模式*/private final MyThreadMode threadMode;/*** 订阅方法接收的事件类型*/private final Class<?> eventType;public MySubscriberMethod(Method method, MyThreadMode threadMode, Class<?> eventType) {this.method = method;this.threadMode = threadMode;this.eventType = eventType;}public Method getMethod() {return method;}public MyThreadMode getThreadMode() {return threadMode;}public Class<?> getEventType() {return eventType;}
}
四、订阅对象-方法封装
再次进行封装 , 将 订阅者对象 和 订阅方法 , 封装到一个类中 , 这个类对象是 注册 , 取消注册 , 事件调用 操作的基本单元 ;
获取到该类的对象 , 就可以执行订阅方法 ;
package com.eventbus_demo.myeventbus;/*** 封装 订阅者对象 与 订阅方法*/
public class MySubscription {/*** 订阅者对象*/private final Object subscriber;/*** 订阅方法*/private final MySubscriberMethod subscriberMethod;public MySubscription(Object subscriber, MySubscriberMethod subscriberMethod) {this.subscriber = subscriber;this.subscriberMethod = subscriberMethod;}public Object getSubscriber() {return subscriber;}public MySubscriberMethod getSubscriberMethod() {return subscriberMethod;}
}
五、线程模式
仿照 EventBus 的线程模式 , 直接照搬过来 ;
线程模式用法参考 【EventBus】Subscribe 注解分析 ( Subscribe 注解属性 | threadMode 线程模型 | POSTING | MAIN | MAIN_ORDERED | ASYNC) ;
package com.eventbus_demo.myeventbus;/*** 直接使用 EventBus 中的现成模式*/
public enum MyThreadMode {POSTING,MAIN,MAIN_ORDERED,BACKGROUND,ASYNC
}
【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )相关推荐
- 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )
文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 六.Activity 中测试上述框架 七.博客源码 一.消息中心 该消息中心是事件通信框架的核心代 ...
- 【EventBus】事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )
文章目录 一.取消注册订阅者 二.完整代码示例 一.取消注册订阅者 取消注册操作 : 从 Map<Object, List<Class<?>>> typesBySu ...
- 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )
文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...
- 【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
文章目录 一.注册订阅方法 二.完整代码示例 一.注册订阅方法 订阅方法注册的过程就是将 订阅方法参数类型 和 订阅类 + 订阅方法 封装类 , 保存到 Map<Class<?>, ...
- 【EventBus】事件通信框架 ( 订阅方法注册 | 检查订阅方法缓存 | 反射获取订阅类中的订阅方法 )
文章目录 一.检查订阅方法缓存 二.反射获取订阅类中的订阅方法 三.完整代码示例 一.检查订阅方法缓存 注册订阅者时 , 只传入一个订阅者类对象 , 其它信息都需要通过反射获取 ; 1. 获取订阅者类 ...
- 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )
文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...
- 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
文章目录 前言 一.订阅类-订阅方法缓存集合 二.事件类型-订阅者集合 三.订阅对象-事件类型集合 前言 首先声明几个数据结构 , 参考 [EventBus]EventBus 源码解析 ( 注册订阅者 ...
- 【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
文章目录 一.根据事件类型获取订阅者 二.调用订阅方法 一.根据事件类型获取订阅者 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收 ...
- 【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )
文章目录 一.EventBus 注册订阅者 二.订阅方法 三.查找订阅方法 findSubscriberMethods 方法 四.查找订阅方法 findUsingInfo 方法 五.查找订阅方法 fi ...
最新文章
- 学编程的不能不看的好文章
- 26.python常用端口号
- linux 为什么编译内核,Linux内核编译与安装
- 测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~
- 计算机辅助技术课设,《计算机辅助设计技术》课程标准-20210311103339.doc-原创力文档...
- Socket编程实践(12) --UDP编程基础
- 【sklearn第二十七讲】模型持久性
- java entitybuilder_Java MultipartEntityBuilder.setContentType方法代码示例
- AS+图灵机器人官网+HTTP POST(json)+JsonReader实现安卓课设《智能聊天机器人》填坑记录
- thinkpad e480安装win7
- element upload 上传文件报错status of undefined
- ubuntu 安装 xv 图像查看软件
- Android11编译32go版本提示”32bit Kernels unsupported by MPGen“
- python:pdf转文字(在线和本地文档)
- eNSP不同网段主机互联-DHCP
- RK3288RK3399 GMAC以太网调试
- ReactNative 接talkingdata统计
- 信息的可再生性举例_举例说说信息的可处理性
- LWIP netconn TCP UDP测试 实例
- 突破微软远程桌面帧率限制