EventBus

171 阅读1分钟

一、原理

1、注册 EventBus.getDefault().register()

  1. 使用反射,在注册的时候(EventBus.getDefault().register(this)),获取类对象中被注解Subscribe注解的方法。
  2. 使用两个HashMap保存信息。这样可以 对象-》方法参数-》方法
  3. subscriptionsByEventType是一个HashMap,保存了以eventType(方法参数类型)为key,Subscription对象(方法包装对象)集合为value的键值对。
  4. typesBySubscribere也是一个HashMap,保存了以当前要注册类的对象为key,注册类中订阅事件的方法的参数类型的集合为value的键值对
  5. 如果有粘性事件的订阅,会查询stickyEvents这个HashMap集合,在进行方法注册的时候就执行一次。

2、取消注册 EventBus.getDefault().unregister()

  1. 先找出对象注册的方法的参数类型,List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
  2. 再遍历subscribedTypes,找出符合参数类型的list。 List subscriptions = subscriptionsByEventType.get(eventType);
  3. 上述两个HashMap 对应注册时存信息的两个,typesBySubscriber和subscriptionsByEventType
  4. 遍历获取的封装方法对象,去掉需要取消注册的对象的相关信息

3、发送事件 EventBus.getDefault().post("Hello World!")

  1. 根据参数类型,先把时间post到ThreadLocal对象的队列中,再循环获取该队列中的事件,处理。
  2. 处理的过程是先获取到该事件类型的订阅者列表,再遍历这些订阅者,根据订阅者信息(最主要的是执行的线程信息threadMode)进行反射执行方法。

4、发送粘性事件 EventBus.getDefault().postSticky("Hello World!")

  1. 把事件存在stickyEvents这个集合中。
  2. 走一遍post()方法。就是第三步中普通的发送事件流程
  3. 使用粘性事件注意处理好空指针异常。可能在注册的时候就有事件执行,而某些用到的变量未初始化。