EventBus3.0源码解析——06. 总结

Posted 夜辉疾风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EventBus3.0源码解析——06. 总结相关的知识,希望对你有一定的参考价值。

EventBus总结

GitHub地址

需要下载源码的,只需要将EventBus中的源码复制下来即可

已将EventBus的整个源码解析过程上传了,点此下载

  1. 大致流程
    1. 懒加载的getDefault(),在注册的时候才初始化
    2. register(Object subscriber);//注册
      1. 将当前class中所有带有@Subscribe注解的方法全部缓存到eventbus中
        1. 缓存Map<class,List<Subscribe>>一个class对应它其中的所有@Subscribe注解的方法
    3. post(Object event);//发送
      1. 先将需要发送的event加入到队列,进行排队等待发送,避免出现大量并发
      2. 判断当前发送的event是否包含了继承关系
        1. 如果有继承关系,则需要每一层继承关系都进行发送
          1. 继承关系中逐级发送的不再是eventClass
        2. 如果没有,则只需要发送当前event对象
      3. 从缓存中取出所有订阅了eventClass的Subscription对象,遍历循环
      4. 判断Subscription对象所需要接收的线程环境
        1. 四种线程环境
        2. 依然在当前线程中接收
          1. 直接post
        3. 在主线程中接收
          1. 使用Handler和Message将消息发送到主线程再post
      5. 拿到Subscription对象中的method对象,使用java反射进行方法调用
        1. method.invoke(subscription.subscriber, event);
    4. @Subscribe //接收
      1. 在需要接收eventbus post的消息的方法上标记@Subscribe
      2. eventbus根据标记的@Subscribe来决定给哪些eventType发送消息
      3. 被标记的方法要求有且只有一个参数,且该参数就是需要接受的参数类型,因为eventbus会给所有接收该参数的被标记的@Subscribe对象发送消息
      4. 可以通过该注解中的三个参数来决定该方法在什么环境下接收消息
        1. sticky()
          1. 使用EventBus.postStickey(Object)传递给该订阅者(如果事件可用)。
        2. priority()
          1. 发送方法的优先级,数字越小,优先级越高,越先发送
        3. ThreadMode threadMode()
          1. 接收消息在什么线程环境下
            1. 当前线程
            2. 主线程
            3. 子线程
            4. 异步线程,耗时操作
    5. unregister(Object subscriber);//注销
      1. 注销当前subscriber下的所有标记了的方法
      2. 循环遍历出当前subscriber下的所有@Subscribe的eventType方法
      3. 找到每一个eventType所缓存的Subscription对象
      4. 从缓存中移除,解除绑定
  2. 疑难处
    1. eventbus中使用了大量的缓存
      1. 包括并发map集合ConcurrentHashMap、并发list列表CopyOnWriteArrayList
      2. 缓存了subscriber对应eventType、eventType对应Subscription等
    2. 线程间的切换
      1. 从其他线程到主线程,利用了Handler和Message
      2. 异步耗时处理
      3. 到子线程
    3. 消息队列
      1. 通过消息队列发送消息
      2. 消息队列来排序优先级
      3. 控制高并发和效率问题

以上是关于EventBus3.0源码解析——06. 总结的主要内容,如果未能解决你的问题,请参考以下文章

EventBus3.0源码解析——05. unregister 注销

Android EventBus3.0使用及源码解析

EventBus3.0源码解析——03. register 注册

EventBus3.0源码解读

EventBus3.0 组件通信框架源码学习总结

EventBus3.0 组件通信框架源码学习总结