基于EventBus API 3.2.0
发布/订阅事件总线框架,基于观察者模式;
四种线程模式:
ThreadMode.POSTING:发送和接收事件在同一线程处理。
ThreadMode.MAIN:发送不管在哪个线程,接受处理都在主线程。
ThreadMode.BACKGROUND:发送不管在哪个线程,接受处理都在子线程。如果在子线程发送事件,则直接在发送事件的线程处理事件。
ThreadMode.ASYNC:不管在哪个线程发送事件,都将开启新的线程处理。
EventBut 内部使用的 map:
1. Map<Class<?>, List<SubscriberMethod>> METHOD_CACHE:
Class<?>:当前添加 rigister(this) 的类;List<SubscriberMethod> 这个类里面使用Subscribe注解的方法的集合。
SubscriberMethod里面的属性:Method对象、线程模式、事件类型(注解方法中的参数类型)、优先级、是否是粘性事等。
2. Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType:
Class<?>:事件类型,CopyOnWriteArrayList<Subscription>:同一事件类型的集合。
Subscription里面的属性:所属的实例化对象 和 SubscriberMethod
3. Map<Object, List<Class<?>>> typesBySubscriber:
Object : 当前添加 rigister(this) 类的实例化对象, List<Class<?>>:这个实例化对象中所有事件类型的集合;
调用EventBus.getDefault().register(this); 注册时 会通过 反射获取当前类里所有Subscribe注解的方法,并获取每个方法的 method, eventType, threadMode, priority, sticky属性封装成一个SubscriberMethod对象,添加到集合里面,再遍历这个集合按照方法的属性分类分别添加到上面三个map里面。详见EventBus类register(Object subscriber)方法,141行。
当发送事件时:
会通过subscriptionsByEventType 获取对应的list遍历去执行里面的方法。
mainThreadPoster是一个获取主线程Looper的Handler的子类 HandlerPoster,就是通过这个handler发送消息到主线程来实现线程切换的。
BackgroundPoster和AsyncPoster都是实现了Runnable接口的类,内部的enqueue方法都是把自己加入EventBus类里面的缓存线程池里,而他们实现Runnable接口的run方法都是调用EventBus的invokeSubscriber()方法。