最近任务不多,想学习一下,于是就想到了看一下常年使用的EventBus源码,写篇日记本篇把eventbus的大体流聊解一下!以便记忆!
eventbus是一个Android事件发布/订阅轻量级框架,
功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。
特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。
eventbus3.1的源码!
现在最新的版本是3.1.1
studio 3.0以上的引用方式:implementation ‘org.greenrobot:eventbus:3.1.1’
eventbus的使用:
1> EventBus.getDefault().register(this) 在需要消费事件的activity或fragment注册!
2> EventBus.getDefault().post(new MessageEvent()) 事件的发送!
3>EventBus.getDefault().unregister(this) 解除绑定!
这里的this,是指当前所在的类的引用!如果不解除注册,那么eventbus会一直持有这个类,(activity,或者fragment)造成不必要的内存支出,当然有绑定就需要解除绑定,eventbus不解除注册的话,会抛出异常!
首先从入口看 EventBus.getDefault().register(this) 注册方法里,做了什么
public static EventBus getDefault() {
EventBus instance = defaultInstance;
if (instance == null) { //看到这里是不是有种熟悉的感觉,这里用到了在众多源码种都会使用的java的一个双重校验锁,只有在第一次调用才会去持有锁!避免不必要的性能消耗!
synchronized (EventBus.class) {
instance = EventBus.defaultInstance;
if (instance == null) {
instance = EventBus.defaultInstance = new EventBus();
}
}
}
return instance;
}
先看getDefault()实例化一个单利对象!
static volatile EventBus defaultInstance; //这里 defaultInstance 用了关键字volatile 来修饰
接下来看new EventBus()中发生了什么
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder(); //这里实例化了一个EventBusBuilder对象
public EventBus() {
this(DEFAULT_BUILDER);//调用了下面的构造方法
}
EventBus(EventBusBuilder builder) { //初始化了一些变量,往下看这些都是干嘛的!
logger = builder.getLogger();
subscriptionsByEventType = new HashMap<>();
typesBySubscriber = new HashMap<>();
stickyEvents = new ConcurrentHashMap<>();
mainThreadSupport = builder.getMainThreadSupport();
mainThreadPoster = mainThreadSupport != null ? mainThreadSupport.createPoster(this) : null;
backgroundPoster = new BackgroundPoster(this);
asyncPoster = new AsyncPoster(this);
indexCount = builder.subscriberInfoIndexes != null ? builder.subscriberInfoIndexes.size() : 0;
subscriberMethodFinder = new SubscriberMethodFinder(builder.subscriberInfoIndexes,
builder.strictMethodVerification, builder.ignoreGeneratedIndex);
logSubscriberExceptions = builder.logSubscriberExceptions;
logNoSubscriberMe