如上图所示,简而言之,EventBus是一个用于Android/Java的发布/订阅事件总线,可以简化组件间的数据传输。它的优势在于解耦事件发送者和接受者,在Activities、Fragments以及后台线程和主线程间的数据传输方面表现不错,避免了复杂和容易出错的依赖关系和生命周期问题。
从源码分析的角度来看,EventBus的数据传输机制,主要是依赖于Java反射机制和自定义注解处理器。对于后者,本章暂且按下不表,集中精力分析EventBus是如何通过反射机制传输数据的。
一、EventBus的实例获取
/** Convenience singleton for apps using a process-wide EventBus instance. */
public static EventBus getDefault() {
EventBus instance = defaultInstance;
if (instance == null) {
synchronized (EventBus.class) {
instance = EventBus.defaultInstance;
if (instance == null) {
instance = EventBus.defaultInstance = new EventBus();
}
}
}
return instance;
}
public EventBus() {
this(DEFAULT_BUILDER);
}
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
从上述代码可知,EventBus的getDefault()方法就是一个采用了单例模式的同步方法,同时分析EventBus的构造器方法可知,EventBus内部的一些参数属性是由EventBusBuilder这个类对象来负责定义的。
public class EventBusBuilder {
private final static ExecutorService DEFAULT_EXECUTOR_SERVICE = Executors.newCachedThreadPool();
...
MainThreadSupport mainThreadSupport;
...
MainThreadSupport getMainThreadSupport() {
if (mainThreadSupport != null) {
return mainThreadSupport;
} else if (AndroidLogger.isAndroidLogAvailable()) {
Object looperOrNull = getAndroidMainLooperOrNull();
return looperOrNull == null ? null :
new MainThreadSupport.AndroidHandlerMainThreadSupport((Looper) looperOrNull);
} else {
return null;
}
}
//获取主线程Looper
Object getAndroidMainLooperOrNull() {
try {
return Looper.getMainLooper();
} catch (RuntimeException e) {
// Not really a functional Android (e.g. "Stub!" maven dependencies)
return null;
}
}
public EventBus installDefaultEventBus() {
synchronized (EventBus.class) {
if (EventBus.defaultInstance != null) {
throw new EventBusException("Default instance already exists." +
" It may be only set once before it's used the first time to ensure consistent behavior.");
}
EventBus.defaultInstance = build();
return EventBus.defaultInstance;
}
}
public EventBus build() {
return new EventBus(this);
}
}
针对EventBusBuilder类,可以简单过一遍,主要是设置了一些属性和生成一些工具,暂时知道它是配合EventBus的构造器方法就好。接着,咱们将注意力转向register方法。
二、E