美文网首页
EventBus源码解析-查询订阅方法

EventBus源码解析-查询订阅方法

作者: Kuma老熊头 | 来源:发表于2019-02-24 14:25 被阅读0次

在EventBus源码解析的注册流程,会涉及到订阅者对象的订阅方法获取;

这篇就来解析下订阅者对象是如何获取订阅方法的;

从下往上看注解4,就可得知在获取完订阅者方法后,会将订阅者对象为key,订阅方法列表为value放入METHOD_CACHE中;

因此注解1第一次查询的时候就为null,根据ignoreGeneratedIndex字段来区分是采用反射机制来获取还是通过索引方式来获取;

先看通过反射机制获取的方式

FindState是EventBus的一个静态内部类,封装了订阅者和所有订阅方法的集合

prepareFindState方法是在缓存对象池中取出1个FindState对象

接着完成订阅者对象和FindState的关联

开启循环查询方法

findUsingReflectionInSingleClass是关键的1个方法

1:先通过反射获取订阅者对象的全部方法

2:循环遍历方法,剔除非public和static的方法

3:获取订阅者方法的参数,该参数也就是我们平常post和接收的事件,当且仅当只有1个参数

4:获取订阅者方法的注解,检查是否可以完成订阅

5:确认可订阅,根据注解的参数创建SubscriberMethod加入列表

6:如果订阅者对象无订阅方法,抛出异常,也就是我们平常使用EventBus时候注册了但是在类中没查询到订阅方法时候报的错

在步骤4中存在1个检查是否可以完成订阅,如何检查呢?接着看

类方法重名检查,父类也可能存在相同的订阅方法;

查询完后,移到父类继续查询,直到findState.clazz 为Null;

最后返回订阅方法集合,并且回收对象下次继续复用;

以上就是通过反射机制来获取订阅方法的机制;

接着看通过索引来获取订阅方法(索引的获取方式涉及到注解处理器的概念,之后找个时间单独学习分享)

相关文章

网友评论

      本文标题:EventBus源码解析-查询订阅方法

      本文链接:https://www.haomeiwen.com/subject/exzvyqtx.html