EventBus
一、原理
1、注册 EventBus.getDefault().register()
- 使用反射,在注册的时候(EventBus.getDefault().register(this)),获取类对象中被注解Subscribe注解的方法。
- 使用两个HashMap保存信息。这样可以 对象-》方法参数-》方法
- subscriptionsByEventType是一个HashMap,保存了以eventType(方法参数类型)为key,Subscription对象(方法包装对象)集合为value的键值对。
- typesBySubscribere也是一个HashMap,保存了以当前要注册类的对象为key,注册类中订阅事件的方法的参数类型的集合为value的键值对
- 如果有粘性事件的订阅,会查询stickyEvents这个HashMap集合,在进行方法注册的时候就执行一次。
2、取消注册 EventBus.getDefault().unregister()
- 先找出对象注册的方法的参数类型,List<Class<?>> subscribedTypes = typesBySubscriber.get(subscriber);
- 再遍历subscribedTypes,找出符合参数类型的list。 List subscriptions = subscriptionsByEventType.get(eventType);
- 上述两个HashMap 对应注册时存信息的两个,typesBySubscriber和subscriptionsByEventType
- 遍历获取的封装方法对象,去掉需要取消注册的对象的相关信息
3、发送事件 EventBus.getDefault().post("Hello World!")
- 根据参数类型,先把时间post到ThreadLocal对象的队列中,再循环获取该队列中的事件,处理。
- 处理的过程是先获取到该事件类型的订阅者列表,再遍历这些订阅者,根据订阅者信息(最主要的是执行的线程信息threadMode)进行反射执行方法。
4、发送粘性事件 EventBus.getDefault().postSticky("Hello World!")
- 把事件存在stickyEvents这个集合中。
- 走一遍post()方法。就是第三步中普通的发送事件流程
- 使用粘性事件注意处理好空指针异常。可能在注册的时候就有事件执行,而某些用到的变量未初始化。