EventBus方法:
onEventMainThread(发送时实参类型)
将接收到的数据,在主线程中执行
onEventPostThread(发送时实参类型)
将接收到的数据,在发送时的线程中进行执行
onEventAsync(发送时实参类型)
将接收到的数据,直接放在线程池中进行执行
onEventBackGroundThread(发送时实参类型)
EventBus.default().register():
实际上不管是几个参数的register调用的都是同一个,去匹配类中符合EventBus命名规则的方法
在调用这个方法的时候去使用传过来的当前类.class , 调用getMethod方法得到当前类中所有的方法,然后开始遍历
判断是否是onEvent开头,是否是public修饰,是否非static或者abstract修饰的方法,是否只有一个实参,满足上述所有
条件才进入到封装部分,根据方法名的结尾是否以MainThread或PostThread或Async或BackGroundThread结尾如果不以这四个
其中一个结尾则continue跳出当前循环,进行下一次循环,如果都不匹配则抛异常。匹配上之后根据不同的后缀设置不同的ThreadMode(执行的线程的模式)
在方法匹配完毕的时候获取方法中实参的数据类型 eventType,最后将方法method,threadMode,eventType存入名叫subscriberMethods(在下面方法中这个方 法名叫var23)(订阅者方法)的List集合中
然后返回
onEventMainThread(发送时实参类型)
将接收到的数据,在主线程中执行
onEventPostThread(发送时实参类型)
将接收到的数据,在发送时的线程中进行执行
onEventAsync(发送时实参类型)
将接收到的数据,直接放在线程池中进行执行
onEventBackGroundThread(发送时实参类型)
将接收到的数据,如果发送时在非UI线程中,则直接在发送线程中执行,否则在线程池中一个接一个执行
EventBus.default():
实际上就是一个单利,创建对象的过程,使用了双if判断以及同步锁,防止并发访问
public static EventBus getDefault() {
if(defaultInstance == null) {
Class var0 = EventBus.class;
synchronized(EventBus.class) {
if(defaultInstance == null) {
defaultInstance = new EventBus();
}
}
}
return defaultInstance;
}
EventBus.default().register():
实际上不管是几个参数的register调用的都是同一个,去匹配类中符合EventBus命名规则的方法
private synchronized void register(Object subscriber, boolean sticky, int priority) {
//findSubscriberMethods这个方法就是去匹配方法 封装进map
List subscriberMethods = this.subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
//所有方法都去调用subscribe方法
Iterator i$ = subscriberMethods.iterator();
while(i$.hasNext()) {
SubscriberMethod subscriberMethod = (SubscriberMethod)i$.next();
this.subscribe(subscriber, subscriberMethod, sticky, priority);
}
}
findSubscriberMethods:在调用这个方法的时候去使用传过来的当前类.class , 调用getMethod方法得到当前类中所有的方法,然后开始遍历
判断是否是onEvent开头,是否是public修饰,是否非static或者abstract修饰的方法,是否只有一个实参,满足上述所有
条件才进入到封装部分,根据方法名的结尾是否以MainThread或PostThread或Async或BackGroundThread结尾如果不以这四个
其中一个结尾则continue跳出当前循环,进行下一次循环,如果都不匹配则抛异常。匹配上之后根据不同的后缀设置不同的ThreadMode(执行的线程的模式)
在方法匹配完毕的时候获取方法中实参的数据类型 eventType,最后将方法method,threadMode,eventType存入名叫subscriberMethods(在下面方法中这个方 法名叫var23)(订阅者方法)的List集合中
然后返回
List<SubscriberMethod> findSubscriberMethods(Class<?> subscriberClass) {
String key = subscriberClass.getName();
Map clazz = methodCache;
List subscriberMethods;
synchronized(methodCache) {
<span style="white-space:pre"> </span>//对于methodCache这个集合 我的理解是所有被register的类 类名做键,类中的所有onEvent开头的方法放进一个List集合做值 都存储在这个集合里面
<span style="white-space:pre"> </span>//那么这段代码显而易见,就是你注册的这个类中存储着所有onEvent开头的方法的集合
<span style="white-space:pre"> </span>//而事实上一个被注册的类中的所有onEvent方法都在subscriberMethods里面
<span style="white-space:pre"> </span>subscriberMethods = (List)methodCache.get(key);
}
//判断通过类名获取到的装着onEvent方法的集合是否为空,如果不为空,那么就是封装过了 直接返回
if(subscriberMethods != nul