EventBus源码分析

223 阅读2分钟

- 设计思想

注解反射方式实现的事件发送订阅总线,APT索引加速,消息池复用

- 使用场景

代码解耦

- API模型

EventBus
    默认单例,配置建造
    观察者注册、注销及查询
    事件(含黏性)发送、取消、清理、查询
    日志工具
EventBusBuilder
    日志工具的注入,开关配置
    线程池配置
    事件发送配置
    索引的添加及忽略
    默认EventBus实例
    建造
@Subscribe 
    订阅者mark配置,主要用途,方法定位、线程模式、订阅事件类型
Logger 
    java,SystemOut,Android(由eventbus-android注入)
SubscriberMethod.ThreadMode(POSTING|MAIN|MAIN_ORDERED|BACKGROUND|ASYNC)
EventBusException

- 架构设计

EventBus 核心
eventbus-android 事件转主线程订阅处理
EventBusAnnotationProcessor APT生成订阅方法信息索引,比反射获取性能高
... 测试代码,索引

- 设计模式

观察者模式
建造者模式
单例模式
生产者消费者模式

- 线程模型

SubscriberMethod.ThreadMode(POSTING|MAIN|MAIN_ORDERED|BACKGROUND|ASYNC)
EventBus.postToSubscription 事件数据在线程中的流转逻辑

- 时序流程

APT建立订阅者信息索引
    1、不同平台编译配置项配置
        .在不同平台(java-library,android,tashs)gradle插件下的配置
        .编译配置项eventBusindex(主要用于指定生成索引类名)

image.png

    2、注解处理器中,读取编译配置项

image.png

    3、注解处理器中,订阅者方法信息索引建立
        .收集订阅者方法及注解信息
        .按类-订阅方法(方法名-参数类)关系建立索引
        .将注解信息逐行写入指定文件
       

image.png image.png

索引方式取到订阅方法(addIndex+register)
    .添加索引到EventBus实例
    .注册订阅者过程,查找用索引方式,查询结果用对象池
    .其它流程与反射订阅方式共用

image.png

反射方式取到订阅方法(register)
    .缓存订阅

image.png

消息发送处理过程(post)
    .支持消息继承关系
    .根据消息类型找到对应类型的订阅
    .消息从当前线程转到订阅线程中处理

image.png

事件切换线程
    .Post线程   发送消息线程(主线程或子线程)
    .HandlerPoster   主线程
    .AsyncPoster   线程池线程,不等待
    .BackgroundPoster  线程池线程,1s等待

image.png

消息对象池
    PendingPost事件池,HandlerPoster、AsyncPoster、BackgroundPoster复用

image.png

消息下发反射调用