EventBus实现原理(手写核心逻辑)

解释一下反射:

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

EventBus核心流程图总结:

发布者post发送一个事件,处理器根据发布的数据类型,然后分配给订阅者方法回调里面。

  • 先注册
  • 通过反射拿到所有的这个类的方法
  • 判断这个类有没有注解,然后存起来。
  • 然后获取到注解的值来判断需不需要转换线程
  • 在post方法里面通过反射,调用这个类方法。
第一步: 声明Subscribe注解
/**
* @Retention 用于声明该注解生效的生命周期,有三个枚举值可以选择
* 1. RetentionPolicy.SOURCE 注释只保留在源码上面,编译成class的时候自动被编译器抹除 * 2. RetentionPolicy.CLASS 注释只保留到字节码上面,VM加载字节码时自动抹除 * 3. RetentionPolicy.RUNTIME 注释永久保留,可以被VM加载时加载到内存中 * 注意:由于我们的目的是想在VM运行时对Filed上的该注解进行反射操作,因此Retention值必须设置为RUNTIME * * @Target 用于指定该注解可以声明在哪些成员上面,常见的值有FIELD和Method, 由于我们的当前注解类是想声明在Filed上面 * 因此这里设置为ElementType.FIELD。 * 注意:如果@Target值不设置,则默认可以添加到任何元素上,不推荐这么写。 * * @interface 是声明注解类的组合关键字。 */ @Target({java.lang.annotation.ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface Subscribe{ }

EventBus实现原理(手写核心逻辑)_第1张图片

第二步:创建注解里面的类型,也就是线程类型

EventBus实现原理(手写核心逻辑)_第2张图片

第三步: 订阅者先进行注册(其实就是存数据到map中)

EventBus实现原理(手写核心逻辑)_第3张图片
EventBus实现原理(手写核心逻辑)_第4张图片

第四步:把每个消息封装成一个对象

EventBus实现原理(手写核心逻辑)_第5张图片

第五步: 通过反射找到所有用注解声明的方法,以类名为key存放到map中

EventBus实现原理(手写核心逻辑)_第6张图片

第六步: 发送post事件

EventBus实现原理(手写核心逻辑)_第7张图片

第七步: 切换线程调度

EventBus实现原理(手写核心逻辑)_第8张图片
EventBus实现原理(手写核心逻辑)_第9张图片

第八步: 解除注册

EventBus实现原理(手写核心逻辑)_第10张图片

Activity中的调用方法:
EventBus实现原理(手写核心逻辑)_第11张图片

EventBus实现原理(手写核心逻辑)_第12张图片

粘性事件?
就是在点击的时候触发,接收消息,完全可以根据本身的类,在map中找到消息,然后根据类型判断, 如果有,通过反射调用

总结:

优点:

  • EventBus简洁、强大
  • 不用写回调接口
  • 可以组件、线程间的相互通信

缺点:

  • 事件的处理(侦听)是通过方法的参数类型来确定的,要定义多个Message
  • 问题查看定位比较麻烦,应为有多个post同时发过来。

你可能感兴趣的:(技术分析)