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. 控制高并发和效率问题
发布了113 篇原创文章 · 获赞 48 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/yehui928186846/article/details/99315863
今日推荐