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

解释一下反射:

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

EventBus核心流程图总结:

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

  • 先注册
  • 通过反射拿到所有的这个类的方法
  • 判断这个类有没有注解,然后存起来。
  • 然后获取到注解的值来判断需不需要转换线程
  • 在post方法里面通过反射,调用这个类方法。
第一步: 声明Subscribe注解
/**
* @Retention 用于声明该注解生效的生命周期,有三个枚举值可以选择<br>
 * 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{
   
}

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

第六步: 发送post事件

在这里插入图片描述

第七步: 切换线程调度

在这里插入图片描述
在这里插入图片描述

第八步: 解除注册

在这里插入图片描述

Activity中的调用方法:
在这里插入图片描述

在这里插入图片描述

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

总结:

优点:

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

缺点:

  • 事件的处理(侦听)是通过方法的参数类型来确定的,要定义多个Message
  • 问题查看定位比较麻烦,应为有多个post同时发过来。
发布了51 篇原创文章 · 获赞 78 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_39079048/article/details/99294197