EventBus3.0源码解析——06. 总结
Posted 夜辉疾风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EventBus3.0源码解析——06. 总结相关的知识,希望对你有一定的参考价值。
EventBus总结
需要下载源码的,只需要将EventBus中的源码复制下来即可
- 大致流程
- 懒加载的getDefault(),在注册的时候才初始化
- register(Object subscriber);//注册
- 将当前class中所有带有@Subscribe注解的方法全部缓存到eventbus中
- 缓存Map<class,List<Subscribe>>一个class对应它其中的所有@Subscribe注解的方法
- 将当前class中所有带有@Subscribe注解的方法全部缓存到eventbus中
- post(Object event);//发送
- 先将需要发送的event加入到队列,进行排队等待发送,避免出现大量并发
- 判断当前发送的event是否包含了继承关系
- 如果有继承关系,则需要每一层继承关系都进行发送
- 继承关系中逐级发送的不再是eventClass
- 如果没有,则只需要发送当前event对象
- 如果有继承关系,则需要每一层继承关系都进行发送
- 从缓存中取出所有订阅了eventClass的Subscription对象,遍历循环
- 判断Subscription对象所需要接收的线程环境
- 四种线程环境
- 依然在当前线程中接收
- 直接post
- 在主线程中接收
- 使用Handler和Message将消息发送到主线程再post
- 拿到Subscription对象中的method对象,使用java反射进行方法调用
- method.invoke(subscription.subscriber, event);
- @Subscribe //接收
- 在需要接收eventbus post的消息的方法上标记@Subscribe
- eventbus根据标记的@Subscribe来决定给哪些eventType发送消息
- 被标记的方法要求有且只有一个参数,且该参数就是需要接受的参数类型,因为eventbus会给所有接收该参数的被标记的@Subscribe对象发送消息
- 可以通过该注解中的三个参数来决定该方法在什么环境下接收消息
- sticky()
- 使用EventBus.postStickey(Object)传递给该订阅者(如果事件可用)。
- priority()
- 发送方法的优先级,数字越小,优先级越高,越先发送
- ThreadMode threadMode()
- 接收消息在什么线程环境下
- 当前线程
- 主线程
- 子线程
- 异步线程,耗时操作
- 接收消息在什么线程环境下
- sticky()
- unregister(Object subscriber);//注销
- 注销当前subscriber下的所有标记了的方法
- 循环遍历出当前subscriber下的所有@Subscribe的eventType方法
- 找到每一个eventType所缓存的Subscription对象
- 从缓存中移除,解除绑定
- 疑难处
- eventbus中使用了大量的缓存
- 包括并发map集合ConcurrentHashMap、并发list列表CopyOnWriteArrayList
- 缓存了subscriber对应eventType、eventType对应Subscription等
- 线程间的切换
- 从其他线程到主线程,利用了Handler和Message
- 异步耗时处理
- 到子线程
- 消息队列
- 通过消息队列发送消息
- 消息队列来排序优先级
- 控制高并发和效率问题
- eventbus中使用了大量的缓存
以上是关于EventBus3.0源码解析——06. 总结的主要内容,如果未能解决你的问题,请参考以下文章
EventBus3.0源码解析——05. unregister 注销