文章目录

  • 一、消息中心
  • 二、订阅方法时的注解
  • 三、订阅方法封装
  • 四、订阅对象-方法封装
  • 五、线程模式

一、消息中心


此处暂时只实现一个单例类 , 后续 注册订阅者 , 处理事件传递 , 取消注册订阅者 , 等功能在该单例类的基础上扩展 ;

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】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )

    文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...

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

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

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

    文章目录 一.根据事件类型获取订阅者 二.调用订阅方法 一.根据事件类型获取订阅者 接收到了 发布者 Publisher 发送给本消息中心 的 Event 消息事件对象 , 将该事件对象转发给相应接收 ...

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

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

最新文章

  1. 学编程的不能不看的好文章
  2. 26.python常用端口号
  3. linux 为什么编译内核,Linux内核编译与安装
  4. 测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~
  5. 计算机辅助技术课设,《计算机辅助设计技术》课程标准-20210311103339.doc-原创力文档...
  6. Socket编程实践(12) --UDP编程基础
  7. 【sklearn第二十七讲】模型持久性
  8. java entitybuilder_Java MultipartEntityBuilder.setContentType方法代码示例
  9. AS+图灵机器人官网+HTTP POST(json)+JsonReader实现安卓课设《智能聊天机器人》填坑记录
  10. thinkpad e480安装win7
  11. element upload 上传文件报错status of undefined
  12. ubuntu 安装 xv 图像查看软件
  13. Android11编译32go版本提示”32bit Kernels unsupported by MPGen“
  14. python:pdf转文字(在线和本地文档)
  15. eNSP不同网段主机互联-DHCP
  16. RK3288RK3399 GMAC以太网调试
  17. ReactNative 接talkingdata统计
  18. 信息的可再生性举例_举例说说信息的可处理性
  19. LWIP netconn TCP UDP测试 实例
  20. 突破微软远程桌面帧率限制

热门文章

  1. .net导出Excel
  2. blockquote 引用的分析
  3. js中的apply()、call() 和 bind()
  4. Android 布局中 如何使控件居中
  5. 最短路之Dijkstra算法
  6. DataTable筛选符合条件的DataRow
  7. PHP魔术方法__call()篇
  8. ASP.NET如何给控件增加属性?
  9. ZOJ 1049 2^x mod n = 1
  10. 在DataGridView中添加行号