public class FirstEvent {
private String mMsg;
public FirstEvent(String msg) {
// TODO Auto-generated constructor stub
mMsg = msg;
}
public String getMsg(){
return mMsg;
}
}
EventBus.getDefault().register(this);
//使用默认方式注册
EventBus.getDefault().unregister(this); //反注册EventBus
EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));
public void onEventMainThread(FirstEvent event) {
Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());
}
例如有下面三个接收函数:
public void onEventMainThread(FirstEvent event) { // 1
Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());
}
public void onEventMainThread(SecondEvent event) { // 2
Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());
}
public void onEvent(ThirdEvent event) { // 3
Log.d("harvic", "OnEvent收到了消息:" + event.getMsg());
}
根据传的参数类型调用
EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked")); //调用函数 1
EventBus.getDefault().post(new SecondEvent ("SecondEvent btn clicked")); //调用函数 2
EventBus.getDefault().post(new ThirdEvent ("ThirdEvent btn clicked")); //调用函数 3
例如有下面三个接收函数:
//SecondEvent接收函数一
public void onEventMainThread(SecondEvent event) {
Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg());
}
//SecondEvent接收函数二
public void onEventBackgroundThread(SecondEvent event){
Log.d("harvic", "onEventBackground收到了消息:" + event.getMsg());
}
//SecondEvent接收函数三
public void onEventAsync(SecondEvent event){
Log.d("harvic", "onEventAsync收到了消息:" + event.getMsg());
}
当调用EventBus.getDefault().post(new SecondEvent ("SecondEvent btn clicked"));
时,上述三个函数都会被调用,但顺序不确定。
设计模式
EventBus是基于观察者模式扩展而来的,又可称为发布 - 订阅模式,它定义了对象间的一种1对多的依赖关系,每当这个对象的状态改变时,其它的对象都会接收到通知并被自动更新。
当然,EventBus的观察者模式和一般的观察者模式不同,它使用了扩展的观察者模式对事件进行订阅和分发,其实这里的扩展就是指的使用了EventBus来作为中介者,抽离了许多职责,如下是它的官方原理图:
每次我们在register之后,都必须进行一次unregister,这是为什么呢?
EventBus2.x的版本与EventBus3.x的版本有哪些区别呢?
现在比较流行的事件总线还有RxBus,那么,它与EventBus相比又如何呢?
注册方法
首先,我们从获取EventBus实例的方法getDefault()开始分析:
public static EventBus getDefault() {
if (defaultInstance == null) {
synchronized (EventBus.class) {
if (defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
在getDefault()中使用了双重校验并加锁的单例模式来创建EventBus实例。
接着,我们看到EventBus的默认构造方法中做了什么:
private static final EventBusBuilder DEFAULT_BUILDER = new EventBusBuilder();
public EventBus() {
this(DEFAULT_BUILDER);
}
EventBusBuilder的构造方法中什么也没有做,那我么继续查看EventBus的这个有参构造方法:
private final Map, CopyOnWriteArrayList> subscriptionsByEventType;
private final Map
在注释4处,新建了三个不同类型的事件发送器,这里总结下:
public void register(Object subscriber) {
Class> subscriberClass = subscriber.getClass();
// 1
List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
synchronized (this) {
for (SubscriberMethod subscriberMethod : subscriberMethods) {
// 2
subscribe(subscriber, subscriberMethod);
}
}
}
在注释1处,根据当前注册类获取 subscriberMethods这个订阅方法列表 。在注释2处,使用了增强for循环令subsciber对象 对 subscriberMethods 中每个 SubscriberMethod 进行订阅。
源码分析