EventBus这个框架是用来消息分发的,可以解除耦合,使代码更加灵活。
平时使用EventBus的代码如下:
EventBus.getDefault().register(this);
EventBus.getDefault().post("this is a message");
EventBus.getDefault().unregister(this);
这个代码里面的EventBus.getDefault()很重要。如果你在自己的app中这么用,当然没关系,getDefault这个方法会返回一个默认的EventBus,你可以指定event在哪个EventBus上发送,一般APP可以用一个EventBus就够了,那调用getDefault也就够了,如果需求较多的话,可以考虑多个EventBus。不同的消息在不同的总线上发,各个消息总线互不干扰。
但是如果在SDK上,不建议使用getDefault,如果依赖SDK的外部工程也是直接调用了getDefault的话,那么SDK内部发出的消息,APP也可能会接收到该消息,当然有些消息可能是比较机密隐私的,不希望外部接收到,尤其是发送基本类型的事件,例如String,int等,如果app也注册了相同的事件,那么app也将收到该消息,对于一些对安全要求比较高的SDK,还是要使用自己单独的EventBus。
public class EventBusUtil {
private static EventBus busSingleton;
public static EventBus getSingleton() {
if (busSingleton == null) {
synchronized (EventBusUtil.class) {
if (busSingleton == null) {
busSingleton = new EventBus();
}
}
}
return busSingleton;
}
public static void post(Object event) {
if (event instanceof OutsideEvent) {
EventBus.getDefault().post(event);
} else {
getSingleton().post(event);
}
}
}
代码中OutsideEvent就是sdk对app提供的事件。如果app调用SDK的接口,回调可以使用EventBus,那么就要定义发给app的事件。发给app的事件还是发到getDefault这个总线上,因为app很可能就是使用default这个总线,当然在接入文档中要说明。
另外如果自定义Event的话,最好Event之间 不要搞继承。如果AEvent继承自BEvent,那么当发出AEvent的话,监听BEvent的人也会监听到,可能会出错,这个要注意,当然如果你的需求就是要这样,那也可以。