EventBus实现分析

207 阅读2分钟

大体变量和主要相关类

先确定几个变量和类型的命名:

event: 在post()方法传入参数和注解@Subscribe的方法的传入参数的类。 eventType: 即event类的类型。Class<?> eventType = event.getClass(); subscriber: EventBus.getDefault().register(this);注册传入的参数。一般为activity。 SubscriberMethod: 注解@Subscribe 标注的方法。 Subscription:包含subscriber和SubscriberMethod两个变量。

部分变量:

//缓存一个event和它一系列的父类和父接口。
private static final Map<Class<?>, List<Class<?>>> eventTypesCache = new HashMap<>();
//已eventType为key,存储所有与eventType相关的Subscription对象。
private final Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType;
//已subscriber为key,存储所有的subscriber中的eventType。
private final Map<Object, List<Class<?>>> typesBySubscriber;
//将Method方法发送到主线程中运行
private final Poster mainThreadPoster;
//将Method方法发送到背景线程中运行
private final BackgroundPoster backgroundPoster;
//将Method方法发送到其他线程中运行
private final AsyncPoster asyncPoster;
//用于查找register中注解的method。
private final SubscriberMethodFinder subscriberMethodFinder;
//用于BackgroundPoster和AsyncPoster新开子线程使用。
private final ExecutorService executorService;

大体流程:

  1. 通过register(this)方法将subscriber注册到eventbus中。然后使用SubscriberMethodFinder通过反射查找出subscriber存在的的注解为@Subscriber的方法。 然后将相应数据填入subscriptionsByEventType和typesBySubscriber中。完成存储。

  2. 通过post(Object event)方法,使用ThreadLocal取出当前线程的PostingThreadState对象。PostingThreadState包含一个事件队列和一个Subscription对象。 然后将传入的event加到队列中。然后挨个取出队列中event,然后通过传入eventType取出subscriptionsByEventType中的Subscription列表。 Subscription对象中的Method变量,然后反射这个Method。

线程切换

  1. 根据注解中的ThreadMode注解,使用不同的Poster实现,分为AsyncPoster,HandlerPoster,BackgroundPoster。分别用于子线程,主线程,背景线程处理数据。AsyncPoster和BackgroundPoster实现有些类似,使用线程池开启一个线程然后反射注解的方法。 但是AsyncPoster和BackgroundPoster不同的是,AsyncPoster只取出event队列中的第一个。 而BackgroundPoster则是将event队列中的所有事件全部取出来后再结束。 HandlerPoster则使用Handler和Message,在Handler的handleMessage()中反射注解的方法。

具体方法实现有时间补上。