源码:EventBus源码原理分析

缺乏、安全感 2021-12-22 07:29 511阅读 0赞

一直对EventBus的实现原理比较好奇,最近看了一下源码,版本是19.0,在这里做一个记录,首先看一下EventBus的其中几个关键变量的类图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb3llcWl1_size_16_color_FFFFFF_t_70

老规矩直接在代码上通过注解分析,这里的核心只是EventBus,不涉及到发布订阅,这个一会再讲

  1. @Beta
  2. public class EventBus {
  3. private static final Logger logger = Logger.getLogger(com.google.common.eventbus.EventBus.class.getName());
  4. private final String identifier;
  5. /**
  6. * 提供线程池的服务
  7. */
  8. private final Executor executor;
  9. /**
  10. * 异常处理类,在这里LoggingHandler实现了这个接口,用户日志的输出
  11. */
  12. private final SubscriberExceptionHandler exceptionHandler;
  13. /**
  14. * 包含所有注册者的注册中心
  15. * new一个新的EventBus的时候,就把一个新的SubscriberRegistry创建出来
  16. * ,并把其自身设置到SubscriberRegistry中
  17. */
  18. private final SubscriberRegistry subscribers = new SubscriberRegistry(this);
  19. /**
  20. * 分发处理,这块我们单独划分处理
  21. */
  22. private final Dispatcher dispatcher;
  23. /**
  24. * 不指定名称的时候默认是default
  25. * 这里的名字主要是日志打印的时候使用
  26. * 所以最好使用不同的名字来指定
  27. */
  28. public EventBus() {
  29. this("default");
  30. }
  31. /**
  32. * 指定米ing子
  33. */
  34. public EventBus(String identifier) {
  35. this(identifier, MoreExecutors.directExecutor(),
  36. Dispatcher.perThreadDispatchQueue(), LoggingHandler.INSTANCE);
  37. }
  38. /**
  39. * 指定异常处理类的时候默认default
  40. */
  41. public EventBus(SubscriberExceptionHandler exceptionHandler) {
  42. this("default",
  43. MoreExecutors.directExecutor(), Dispatcher.perThreadDispatchQueue(), exceptionHandler);
  44. }
  45. /**
  46. * 这是默认的构造函数,所有的
  47. * 1、EventBus(SubscriberExceptionHandler exceptionHandler)
  48. * 2、EventBus(String identifier)
  49. * 3、EventBus()
  50. * 最终都是指向这里,这个在设计上有很好的拓展性,只要保证这个核心不变,怎么拓展都可以
  51. */
  52. EventBus(String identifier, Executor executor, Dispatcher dispatcher,
  53. SubscriberExceptionHandler exceptionHandler) {
  54. this.identifier = checkNotNull(identifier);
  55. this.executor = checkNotNull(executor);
  56. this.dispatcher = checkNotNull(dispatcher);
  57. this.exceptionHandler = checkNotNull(exceptionHandler);
  58. }
  59. /**
  60. * 返回EventBus的名称
  61. */
  62. public final String identifier() {
  63. return identifier;
  64. }
  65. /**
  66. * executor用户给subscribers分发事件,这里有两种情况
  67. * 1、默认不指定的时候是MoreExecutors.directExecutor()方式
  68. * 2、我们自己指定executor,这个在AsyncEventBus中,异步的方式由多线程处理
  69. * 这里我们重点看下MoreExecutors.directExecutor()这种方式,看一下源码的实现,
  70. * 执行方法不会新开线程都在当前线程做,调用的是execute方法
  71. * public static Executor directExecutor() {
  72. * return DirectExecutor.INSTANCE;
  73. * }
  74. *
  75. * 这里很有意思的一点是枚举是枚举是实现接口,这利用了枚举类型实例受限的原理
  76. * 具体可以看这篇文章
  77. * https://www.jianshu.com/p/e1619882682d
  78. * https://blog.csdn.net/qq_21508059/article/details/78806610
  79. * private enum DirectExecutor implements Executor {
  80. * INSTANCE;
  81. * @Override public void execute(Runnable command) {
  82. * command.run();
  83. * }
  84. *
  85. * @Override public String toString() {
  86. * return "MoreExecutors.directExecutor()";
  87. * }
  88. * }
  89. */
  90. final Executor executor() {
  91. return executor;
  92. }
  93. /**
  94. * 由任何一个subscriber抛出的异常都由这个方法处理
  95. */
  96. void handleSubscriberException(Throwable e, SubscriberExceptionContext context) {
  97. checkNotNull(e);
  98. checkNotNull(context);
  99. try {
  100. exceptionHandler.handleException(e, context);
  101. } catch (Throwable e2) {
  102. // if the handler threw an exception... well, just log it
  103. logger.log(Level.SEVERE,
  104. String.format(Locale.ROOT, "Exception %s thrown while handling exception: %s", e2, e),
  105. e2);
  106. }
  107. }
  108. /**
  109. * 注册一个订阅者,这里我们通常是业务中的Service
  110. */
  111. public void register(Object object) {
  112. subscribers.register(object);
  113. }
  114. /**
  115. * 解绑
  116. */
  117. public void unregister(Object object) {
  118. subscribers.unregister(object);
  119. }
  120. /**
  121. * 发送我们的事件给所有订阅者,有订阅者就会进行相应的分发
  122. */
  123. public void post(Object event) {
  124. Iterator<Subscriber> eventSubscribers = subscribers.getSubscribers(event);
  125. if (eventSubscribers.hasNext()) {
  126. dispatcher.dispatch(event, eventSubscribers);
  127. } else if (!(event instanceof DeadEvent)) {
  128. // the event had no subscribers and was not itself a DeadEvent
  129. post(new DeadEvent(this, event));
  130. }
  131. }
  132. @Override
  133. public String toString() {
  134. return MoreObjects.toStringHelper(this)
  135. .addValue(identifier)
  136. .toString();
  137. }
  138. /**
  139. * 这里定制了一个LoggingHandler的日志实现类
  140. * 处理由一个subscriber抛出的异常,因为要继承上下文,所以要单独实现
  141. * 但是为啥要放在EventBus里边呢,我想这是因为所有的subscriber都需要EventBus统一管理的原因,另外有两种方式
  142. * 1、默认就是下边静态类的方式
  143. * 2、各个业务也可以实现自己的异常处理方式
  144. * 3、异常处理作为EventBus的成员变量可以有很好的拓展性
  145. * 最近发现了很多静态内部类使用的情况,为什么这样呢,其实静态内部类可以提高其封装性,比如Person类中指定Home内部静态类
  146. * home是独立存在的,不依赖Person的,具体可以看https://www.cnblogs.com/DreamDrive/p/5428729.html
  147. */
  148. static final class LoggingHandler implements SubscriberExceptionHandler {
  149. static final LoggingHandler INSTANCE = new LoggingHandler();
  150. @Override
  151. public void handleException(Throwable exception, SubscriberExceptionContext context) {
  152. Logger logger = logger(context);
  153. if (logger.isLoggable(Level.SEVERE)) {
  154. logger.log(Level.SEVERE, message(context), exception);
  155. }
  156. }
  157. private static Logger logger(SubscriberExceptionContext context) {
  158. return Logger.getLogger(EventBus.class.getName() + "." + context.getEventBus().identifier());
  159. }
  160. private static String message(SubscriberExceptionContext context) {
  161. Method method = context.getSubscriberMethod();
  162. return "Exception thrown by subscriber method "
  163. + method.getName() + '(' + method.getParameterTypes()[0].getName() + ')'
  164. + " on subscriber " + context.getSubscriber()
  165. + " when dispatching event: " + context.getEvent();
  166. }
  167. }
  168. }

下边我们来看一下注册和发布,这是EventBus的核心了,不过这块有个疑问,观察者模式和发布订阅模式有什么区别呢?通过这篇文章先来了解一下,我们来看下三个关键的类SubscriberRegistry、Subscriber和Dispatcher,先看一下类图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21hb3llcWl1_size_16_color_FFFFFF_t_70 1

看一下SubscriberRegistry

  1. /**
  2. * 这是一个final类,一个final类是无法被任何人继承的,意味着设计的很完美
  3. */
  4. final class SubscriberRegistry {
  5. /**
  6. * ConcurrentMap的key是post的对一个的类型,后者是所有的订阅者
  7. * 某一个类型-某一个服务中所有的方法
  8. */
  9. private final ConcurrentMap<Class<?>, CopyOnWriteArraySet<Subscriber>> subscribers =
  10. Maps.newConcurrentMap();
  11. /**
  12. * 注册中心是属于那一个EventBus的
  13. */
  14. @Weak private final EventBus bus;
  15. SubscriberRegistry(EventBus bus) {
  16. this.bus = checkNotNull(bus);
  17. }
  18. /**
  19. * 注册所有的subscriber有Subscribe注解的方法
  20. */
  21. void register(Object listener) {
  22. /**
  23. * 所有的listener(通常就是业务的service)的添加Subscribe注解的方法
  24. */
  25. Multimap<Class<?>, Subscriber> listenerMethods = findAllSubscribers(listener);
  26. /**
  27. * 获取一个类型对应的所有的Subscriber
  28. */
  29. for (Map.Entry<Class<?>, Collection<Subscriber>> entry : listenerMethods.asMap().entrySet()) {
  30. /**
  31. * 获取key和value
  32. */
  33. Class<?> eventType = entry.getKey();
  34. Collection<Subscriber> eventMethodsInListener = entry.getValue();
  35. /**
  36. * 获取这个类型对应的所有方法集合
  37. */
  38. CopyOnWriteArraySet<Subscriber> eventSubscribers = subscribers.get(eventType);
  39. /**
  40. * 如果是空的则创建一个新的
  41. */
  42. if (eventSubscribers == null) {
  43. CopyOnWriteArraySet<Subscriber> newSet = new CopyOnWriteArraySet<Subscriber>();
  44. eventSubscribers = MoreObjects.firstNonNull(subscribers.putIfAbsent(eventType, newSet), newSet);
  45. }
  46. /**
  47. * 不是空的就把所有的监听这个类型所有方法都添加进去
  48. * 为什么有这样的判断呢,这是因为一个eventbus可能被多个服务注册
  49. * 先进行的服务肯定是空的,后进行的直接加入进去就可以
  50. */
  51. eventSubscribers.addAll(eventMethodsInListener);
  52. }
  53. }
  54. /**
  55. * 解绑,就是一个正常移除的裹层这里不做过去的讲解
  56. */
  57. void unregister(Object listener) {
  58. Multimap<Class<?>, Subscriber> listenerMethods = findAllSubscribers(listener);
  59. for (Map.Entry<Class<?>, Collection<Subscriber>> entry : listenerMethods.asMap().entrySet()) {
  60. Class<?> eventType = entry.getKey();
  61. Collection<Subscriber> listenerMethodsForType = entry.getValue();
  62. CopyOnWriteArraySet<Subscriber> currentSubscribers = subscribers.get(eventType);
  63. if (currentSubscribers == null || !currentSubscribers.removeAll(listenerMethodsForType)) {
  64. throw new IllegalArgumentException(
  65. "missing event subscriber for an annotated method. Is " + listener + " registered?");
  66. }
  67. }
  68. }
  69. /**
  70. * 根据event获取所有的订阅者,这里的event就是指的我们post的数据,也就是根据我们post的数据类型找到所有的Subscribers
  71. * 这里是通过缓存获取的数据类型,会节省大量的时间
  72. */
  73. Iterator<Subscriber> getSubscribers(Object event) {
  74. ImmutableSet<Class<?>> eventTypes = flattenHierarchy(event.getClass());
  75. List<Iterator<Subscriber>> subscriberIterators =
  76. Lists.newArrayListWithCapacity(eventTypes.size());
  77. /**
  78. * 包括当前的类型以及父类或者接口,都会返回给这个数据的调用者
  79. */
  80. for (Class<?> eventType : eventTypes) {
  81. CopyOnWriteArraySet<Subscriber> eventSubscribers = subscribers.get(eventType);
  82. if (eventSubscribers != null) {
  83. // eager no-copy snapshot
  84. subscriberIterators.add(eventSubscribers.iterator());
  85. }
  86. }
  87. /**
  88. * 返回的是一个迭代器,好让我们迭代调用
  89. */
  90. return Iterators.concat(subscriberIterators.iterator());
  91. }
  92. /**
  93. * 带Subscriber注解方法的缓存,在GC的时候由于是weakKeys会回收掉
  94. */
  95. private static final LoadingCache<Class<?>, ImmutableList<Method>> subscriberMethodsCache =
  96. CacheBuilder.newBuilder()
  97. .weakKeys()
  98. .build(new CacheLoader<Class<?>, ImmutableList<Method>>() {
  99. @Override
  100. public ImmutableList<Method> load(Class<?> concreteClass) throws Exception {
  101. return getAnnotatedMethodsNotCached(concreteClass);
  102. }
  103. });
  104. /**
  105. * listener是我们的服务
  106. * 返回的是type-{方法一的Subscriber、方法二的Subscriber等}
  107. */
  108. private Multimap<Class<?>, Subscriber> findAllSubscribers(Object listener) {
  109. /**
  110. * 这块为什么用Multimap呢,这是因为一个服务中的一个类型可能会对应不同的方法
  111. */
  112. Multimap<Class<?>, Subscriber> methodsInListener = HashMultimap.create();
  113. /**
  114. * 获取对应服务的字节码
  115. */
  116. Class<?> clazz = listener.getClass();
  117. /**
  118. * 获取所有包含Subscribe注解方法,注意
  119. * 1、这里加了一个全生命周期的缓存,可以有效减少通过反射获取方法的时间
  120. * 2、判断注解的方法
  121. */
  122. for (Method method : getAnnotatedMethods(clazz)) {
  123. Class<?>[] parameterTypes = method.getParameterTypes();
  124. /**
  125. * 只是取了方法的第一个参数作为类型
  126. * 存储的key-value可以理解为
  127. * type-{方法一的Subscriber、方法二的Subscriber等}
  128. */
  129. Class<?> eventType = parameterTypes[0];
  130. methodsInListener.put(eventType, Subscriber.create(bus, listener, method));
  131. }
  132. return methodsInListener;
  133. }
  134. private static ImmutableList<Method> getAnnotatedMethods(Class<?> clazz) {
  135. return subscriberMethodsCache.getUnchecked(clazz);
  136. }
  137. /**
  138. * 获取clazz中带有Subscribe注解的方法
  139. */
  140. private static ImmutableList<Method> getAnnotatedMethodsNotCached(Class<?> clazz) {
  141. Set<? extends Class<?>> supertypes = TypeToken.of(clazz).getTypes().rawTypes();
  142. /**
  143. * 重写了eqaul和hash重新定义了方法的唯一的标志,作为唯一的key
  144. */
  145. Map<MethodIdentifier, Method> identifiers = Maps.newHashMap();
  146. for (Class<?> supertype : supertypes) {
  147. for (Method method : supertype.getDeclaredMethods()) {
  148. if (method.isAnnotationPresent(SubscriberRegistryTest.class) && !method.isSynthetic()) {
  149. Class<?>[] parameterTypes = method.getParameterTypes();
  150. checkArgument(parameterTypes.length == 1,
  151. "Method %s has @Subscribe annotation but has %s parameters."
  152. + "Subscriber methods must have exactly 1 parameter.",
  153. method, parameterTypes.length);
  154. MethodIdentifier ident = new MethodIdentifier(method);
  155. if (!identifiers.containsKey(ident)) {
  156. identifiers.put(ident, method);
  157. }
  158. }
  159. }
  160. }
  161. return ImmutableList.copyOf(identifiers.values());
  162. }
  163. /**
  164. * 获取raw types:一般类型,例如:String,Collections ,Math,Number的缓存
  165. * https://blog.csdn.net/Fran_Lee/article/details/75331837
  166. */
  167. private static final LoadingCache<Class<?>, ImmutableSet<Class<?>>> flattenHierarchyCache =
  168. CacheBuilder.newBuilder()
  169. .weakKeys()
  170. .build(new CacheLoader<Class<?>, ImmutableSet<Class<?>>>() {
  171. @SuppressWarnings("RedundantTypeArguments") // <Class<?>> is actually needed to compile
  172. @Override
  173. public ImmutableSet<Class<?>> load(Class<?> concreteClass) {
  174. return ImmutableSet.<Class<?>>copyOf(
  175. TypeToken.of(concreteClass).getTypes().rawTypes());
  176. }
  177. });
  178. /**
  179. * 获取的是当前的数据结构包括,这个数据结构对应的父类以及接口
  180. */
  181. @VisibleForTesting
  182. static ImmutableSet<Class<?>> flattenHierarchy(Class<?> concreteClass) {
  183. try {
  184. return flattenHierarchyCache.getUnchecked(concreteClass);
  185. } catch (UncheckedExecutionException e) {
  186. throw Throwables.propagate(e.getCause());
  187. }
  188. }
  189. private static final class MethodIdentifier {
  190. private final String name;
  191. private final List<Class<?>> parameterTypes;
  192. MethodIdentifier(Method method) {
  193. this.name = method.getName();
  194. this.parameterTypes = Arrays.asList(method.getParameterTypes());
  195. }
  196. @Override
  197. public int hashCode() {
  198. return Objects.hashCode(name, parameterTypes);
  199. }
  200. @Override
  201. public boolean equals(@Nullable Object o) {
  202. if (o instanceof MethodIdentifier) {
  203. MethodIdentifier ident = (MethodIdentifier) o;
  204. return name.equals(ident.name) && parameterTypes.equals(ident.parameterTypes);
  205. }
  206. return false;
  207. }
  208. }
  209. }

再看一下Subscriber:

  1. class Subscriber {
  2. /**
  3. * 根据是不是线程安全的来创建,这是我们在SubscriberRegistry中的create方法
  4. */
  5. static Subscriber create(EventBus bus, Object listener, Method method) {
  6. return isDeclaredThreadSafe(method)
  7. ? new Subscriber(bus, listener, method)
  8. : new SynchronizedSubscriber(bus, listener, method);
  9. }
  10. /**
  11. * Subscriber属于哪一个bus
  12. */
  13. @Weak private EventBus bus;
  14. /**
  15. * Subscriber属于哪一个服务
  16. */
  17. @VisibleForTesting
  18. final Object target;
  19. /**
  20. * Subscribertarget对应的方法
  21. */
  22. private final Method method;
  23. /**
  24. * 线程池,没有的话默认是当前线程执行,是bus中的executor
  25. */
  26. private final Executor executor;
  27. private Subscriber(EventBus bus, Object target, Method method) {
  28. this.bus = bus;
  29. this.target = checkNotNull(target);
  30. this.method = method;
  31. method.setAccessible(true);
  32. this.executor = bus.executor();
  33. }
  34. /**
  35. * 开启线程开始分发数据
  36. */
  37. final void dispatchEvent(final Object event) {
  38. executor.execute(new Runnable() {
  39. @Override
  40. public void run() {
  41. try {
  42. invokeSubscriberMethod(event);
  43. } catch (InvocationTargetException e) {
  44. bus.handleSubscriberException(e.getCause(), context(event));
  45. }
  46. }
  47. });
  48. }
  49. /**
  50. * 调用method的invoke方法利用反射进行,event是我们要post的数据,
  51. * 这是这个类里唯一的变量,其他的在初始化的时候就已经创建好了
  52. */
  53. @VisibleForTesting
  54. void invokeSubscriberMethod(Object event) throws InvocationTargetException {
  55. try {
  56. method.invoke(target, checkNotNull(event));
  57. } catch (IllegalArgumentException e) {
  58. throw new Error("Method rejected target/argument: " + event, e);
  59. } catch (IllegalAccessException e) {
  60. throw new Error("Method became inaccessible: " + event, e);
  61. } catch (InvocationTargetException e) {
  62. if (e.getCause() instanceof Error) {
  63. throw (Error) e.getCause();
  64. }
  65. throw e;
  66. }
  67. }
  68. /**
  69. * 有这个AllowConcurrentEvents注解的时候就表示线程不安全的,这个我们一般在异步eventbus中使用,
  70. * 自己保证代码是线程安全的
  71. */
  72. private static boolean isDeclaredThreadSafe(Method method) {
  73. return method.getAnnotation(AllowConcurrentEvents.class) != null;
  74. }
  75. /**
  76. * synchronized保证了线程安全,我们在使用普通的EventBus的时候都是加锁了的
  77. */
  78. @VisibleForTesting
  79. static final class SynchronizedSubscriber extends Subscriber {
  80. private SynchronizedSubscriber(EventBus bus, Object target, Method method) {
  81. super(bus, target, method);
  82. }
  83. @Override
  84. void invokeSubscriberMethod(Object event) throws InvocationTargetException {
  85. synchronized (this) {
  86. super.invokeSubscriberMethod(event);
  87. }
  88. }
  89. }
  90. }

最后看一下Dispatcher:

  1. /**
  2. * 抽象类
  3. */
  4. abstract class Dispatcher {
  5. /**
  6. * 默认的方式,提供重入的方式确保所有的数据都能发送出去
  7. */
  8. static Dispatcher perThreadDispatchQueue() {
  9. return new PerThreadQueuedDispatcher();
  10. }
  11. static Dispatcher legacyAsync() {
  12. return new LegacyAsyncDispatcher();
  13. }
  14. static Dispatcher immediate() {
  15. return ImmediateDispatcher.INSTANCE;
  16. }
  17. /**
  18. * 分发方法
  19. */
  20. abstract void dispatch(Object event, Iterator<Subscriber> subscribers);
  21. /**
  22. * 一个实现类对subscribers分发event,ThreadLocal的方式
  23. */
  24. private static final class PerThreadQueuedDispatcher extends Dispatcher {
  25. // This dispatcher matches the original dispatch behavior of EventBus.
  26. /**
  27. * 每个线程都有一个独立的队列
  28. */
  29. private final ThreadLocal<Queue<Event>> queue =
  30. new ThreadLocal<Queue<Event>>() {
  31. @Override
  32. protected Queue<Event> initialValue() {
  33. return Queues.newArrayDeque();
  34. }
  35. };
  36. /**
  37. * 每个线程都有一个独立的bool
  38. */
  39. private final ThreadLocal<Boolean> dispatching =
  40. new ThreadLocal<Boolean>() {
  41. @Override
  42. protected Boolean initialValue() {
  43. return false;
  44. }
  45. };
  46. @Override
  47. void dispatch(Object event, Iterator<Subscriber> subscribers) {
  48. checkNotNull(event);
  49. checkNotNull(subscribers);
  50. Queue<Event> queueForThread = queue.get();
  51. queueForThread.offer(new Event(event, subscribers));
  52. if (!dispatching.get()) {
  53. dispatching.set(true);
  54. try {
  55. Event nextEvent;
  56. while ((nextEvent = queueForThread.poll()) != null) {
  57. while (nextEvent.subscribers.hasNext()) {
  58. nextEvent.subscribers.next().dispatchEvent(nextEvent.event);
  59. }
  60. }
  61. } finally {
  62. dispatching.remove();
  63. queue.remove();
  64. }
  65. }
  66. }
  67. private static final class Event {
  68. private final Object event;
  69. private final Iterator<Subscriber> subscribers;
  70. private Event(Object event, Iterator<Subscriber> subscribers) {
  71. this.event = event;
  72. this.subscribers = subscribers;
  73. }
  74. }
  75. }
  76. /**
  77. * 一个实现类对subscribers分发event,通过队列的方式异步发送
  78. */
  79. private static final class LegacyAsyncDispatcher extends Dispatcher {
  80. /**
  81. * Global event queue.
  82. */
  83. private final ConcurrentLinkedQueue<EventWithSubscriber> queue =
  84. Queues.newConcurrentLinkedQueue();
  85. @Override
  86. void dispatch(Object event, Iterator<Subscriber> subscribers) {
  87. checkNotNull(event);
  88. while (subscribers.hasNext()) {
  89. queue.add(new EventWithSubscriber(event, subscribers.next()));
  90. }
  91. EventWithSubscriber e;
  92. while ((e = queue.poll()) != null) {
  93. e.subscriber.dispatchEvent(e.event);
  94. }
  95. }
  96. private static final class EventWithSubscriber {
  97. private final Object event;
  98. private final Subscriber subscriber;
  99. private EventWithSubscriber(Object event, Subscriber subscriber) {
  100. this.event = event;
  101. this.subscriber = subscriber;
  102. }
  103. }
  104. }
  105. /**
  106. * 一个实现类对subscribers分发event,立即发送
  107. */
  108. private static final class ImmediateDispatcher extends Dispatcher {
  109. private static final ImmediateDispatcher INSTANCE = new ImmediateDispatcher();
  110. @Override
  111. void dispatch(Object event, Iterator<Subscriber> subscribers) {
  112. checkNotNull(event);
  113. while (subscribers.hasNext()) {
  114. subscribers.next().dispatchEvent(event);
  115. }
  116. }
  117. }
  118. }

照例总结一下:
1、使用了发布订阅者模式,注意和观察者模式的区别,具体两者的区别可以看这篇文章https://www.jianshu.com/p/594f018b68e7
2、EventBus等使用了内部静态类提高代码的封装性,对应Person-Home的关系
3、枚举实现接口,利用枚举类型受限的原理,在枚举里边实现不同的类型,比如一个飞翔接口,就是三个种枚举分别是麻雀、喜鹊、布谷,限定这三种那就可以用这种方式
4、利用类的组件不断通过new 对象的方式将数据进行传递,区别于业务中service变量的方式进行
5、总体流程:
A、EventBus在创建的时候就指定好Dispatcher,专门用于帮助分发
B、指定好executor用于执行线程,默认是当前线程执行
C、SubscriberRegistry是发布订阅的核心,在创建EventBus的时候,就将EventBus作为变量传递给SubscriberRegistry
D、EventBus中的register方法实际是调用SubscriberRegistry的register方法进行注册,注册是key-value的形式:key是post的数据类型,包括父类和接口,value是多个值包括所有的这个类型的方法,通过注解查找到;value实际就是Subscriber,在注册的时候把eventbus、类型,方法等传递到Subscriber中去
E、post方法调用Dispatcher获取所有的Subscriber进行分发数据
6、由于TypeToken.of查找和getDeclaredMethods()比较频繁耗时,源码里边加上了缓存,由于启动之后就不会再变所以都是永久的
7、通过方法调用传递服务和通过注解的方式注入服务一样主要,一个是工具类使用,一个是业务方法使用

发表评论

表情:
评论列表 (有 0 条评论,511人围观)

还没有评论,来说两句吧...

相关阅读

    相关 EventBus分析

    前言 EventBus是一种用于Android的发布/订阅事件总线。它有很多优点:简化应用组件间的通信;解耦事件的发送者和接收者;避免复杂和容易出错的依赖和生命周期的问题