简单使用:
首先依赖eventbus
api ‘org.greenrobot:eventbus:3.2.0’
使用的方式很简单
在activity或者fragment中注册
EventBus.getDefault().register(this);
别忘记最后接触注册
EventBus.getDefault().unregister(this);
发送消息
EventBus.getDefault().post(msg)
接收消息
@Subscribe
public void getMsg(EventMessage msg){
}
这样eventbus就可以使用了接下来分析原理,按照上面的使用步骤挨个分析:首先分析注册的原理:
方法一
public void register(Object subscriber) {
1.获取订阅的class类型对象
Class<?> subscriberClass = subscriber.getClass();
2.获取当前class类对象所订阅的方法集合查看方法二
List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass);
synchronized (this) {
3.遍历所有的方法合集,订阅事件 查看方法三
for (SubscriberMethod subscriberMethod : subscriberMethods) {
subscribe(subscriber, subscriberMethod);
}
}
}
方法二
List<SubscriberMethod> findSubscriberMethods(Class<?> subscriberClass) {
首先先从METHOD_CACH中获取,如果有直接返回,不执行接下来的方法
List<SubscriberMethod> subscriberMethods = METHOD_CACHE.get(subscriberClass);
if (subscriberMethods != null) {
return subscriberMethods;
}
if (ignoreGeneratedIndex) {
这块如果自定义了EventBusBuilder,就走这块不是我们关注的重点
subscriberMethods = findUsingReflection(subscriberClass);
} else {
主要看这块
subscriberMethods = findUsingInfo(subscriberClass);
}
if (subscriberMethods.isEmpty()) {
throw new EventBusException("Subscriber " + subscriberClass
+ " and its super classes have no public methods with the @Subscribe annotation");
} else {
METHOD_CACHE.put(subscriberClass, subscriberMethods);
return subscriberMethods;
}
}
接下来看这个方法
private List<SubscriberMethod> findUsingInfo(Class<?> subscriberClass) {
// FindState辅助我们查找订阅方法的类,
FindState findState = prepareFindState();
//将我们订阅的类传递进去
findState.initForSubscriber(subscriberClass);
//findState.clazz就是上面initForSubscriber传递进去的类
while (findState.clazz != null) {
//获取我们订阅类的订阅方法信息
findState.subscriberInfo = getSubscriberInfo(findState);
//第一次为空
if (findState.subscriberInfo != null) {
SubscriberMethod[] array = findState.subscriberInfo.getSubscriberMethods();
for (SubscriberMethod subscriberMethod : array) {
if (findState.checkAdd(subscriberMethod.method, subscriberMethod.eventType)) {
findState.subscriberMethods.add(subscriberMethod);
}
}
} else {
//直接看这里
findUsingReflectionInSingleClass(findState);
}
findState.moveToSuperclass();
}
// 将查找到的方法保存在了FindState实例的subscriberMethods集合中。然后使用subscriberMethods构建一个新的List<SubscriberMethod>并返回,最后释放掉findState
return getMethodsAndRelease(findState);
}
/**
* 作用:通过反射获取订阅方法的信息
*/
private void findUsingReflectionInSingleClass(FindState findState) {
Method[] methods;
try {
// This is faster than getMethods, especially when subscribers are fat classes like Activities
methods = findState.clazz.getDeclaredMethods();
} catch (Throwable th) {
// Workaround for java.lang.NoClassDefFoundError, see https://github.com/greenrobot/EventBus/issues/149
try {
methods = findState.clazz.getMethods();
} catch (LinkageError error) {
// super class of NoClassDefFoundError to be a bit more broad...
String msg = "Could not inspect methods of " + findState.clazz.getName();
if (ignoreGeneratedIndex) {
msg += ". Please consider using EventBus annotation processor to avoid reflection.";
} else {
msg +=