织梦网站修改数据库表数据,网页图片尺寸,wordpress局部内容,wordpress 删除线一#xff0c;概述
EventBus即事件总线#xff0c;在软件架构设计中#xff0c;采用事件-发布-订阅类架构#xff0c;通常具备高内聚低耦合特性#xff0c;相对比通过Android#Broadcast方式#xff0c;此框架由于不涉及跨进程方式#xff0c;效率更加高效#xff0c;并…一概述
EventBus即事件总线在软件架构设计中采用事件-发布-订阅类架构通常具备高内聚低耦合特性相对比通过Android#Broadcast方式此框架由于不涉及跨进程方式效率更加高效并且提供了类似注解订阅方式EventBus全局访问不会被局限context组件。
笔者理解这就是解耦框架将不关联模块解耦只通过总线方式通线在企业级架构设计中EventBus被经常使用。
二实例
依赖
implementation org.greenrobot:eventbus:3.3.1
获取EventBus实例通常由默认方法getDefault 或者通过build定制化参数获得比如可以在build中添加SubscriberInfoIndex接口自定义订阅方法这就无需依赖Subscribe注解 并且重写getSubscriberInfo方法即可 但笔者仍推荐Subscribe注解但如果一个类中方法特别多反射多方法存在性能开销可以考虑index方式快速找到方法
三源码
1register 1通过subscriberFinder找到订阅方法核心就在于怎么找要么通过注解要么通过index接口
2对单个实例订阅该方法订阅事件即方法参数
跟进findSubscribeMethods 1从缓存查找命中即返回
2如果build参数ignoreGeneratedIndex为true则直接通过反射查找否则可以尝试index接口
3index接口超找订阅方法
4缓存
跟进findUsingInfo方法 1通过getSubscriberInfo找到SubscribeInfo
2如果没有index接口则通过反射查找
跟进findUsingReflectionInSingleClass 1反射所有声明方法
3找到Subscribe注解方法
4创建SubscribeMethod实体保存此方法
最后根据这个findState返回method 再将FindState放进对象池中此处是享元模式设计减少FindState创建数量 2post
sticky粘性事件sticky区分状态或事件事件存在实时性而状态存在唯一性因此状态一般是粘性而事件则是非粘性
在register中通过订阅方法的sticky字段决定是否将stickEvents中事件发布给订阅者 stickyEvents需要显示添加否则普通post仅是普通事件无法加入stickyEvents Map 直接看post源码 1从ThreadLocal中获得PostingThredState其isPosing表示是否正在发送事件
当isPosing为false则通过eventQueue出队消费事件
跟进postSingleEvent 上述存在可继承性事件判断这在构造EventBus中设置如下 跟进postSingleEventForEventType 通过subscriptionEventType通过event快速获得订阅者
这行map在register的subscribe中添加 跟进postToSubscription发布时间到subscription 根据线程模型选择策略
POSTING当前线程
MAIN当前是主线程直接触发或者加入主线程队列
MAIN_OROERED加入主线程队列
BACKGROUND子线程
ASYNC反正异步也是一个子线程
跟进invokeSubscribert 这就很简单了method#invoke传入event即可通知到订阅者
四注意
避免内存泄漏对于存在生命周期的对象或需要销毁的对象及时调用EventBus#unregister方法反注册不然将作为Subscription#subscriber对象存在EventBus引用中。