组件化学习(2)Arouter原理学习

1.Arouter原理

(1)一句话总结ARouter的原理:

就像上篇文章讲到的全局Map一样,它有一个在编译期生成的路由表。虽然各模块之间没有横向依赖,但是信息传递的时候,可以通过查找路由表,找到需要通信的模块的class对象,从而进行通信。也就是说ARouter的核心就是路由表

(2)ARouter是编译期的框架

既然有表,那就有表中元素的registergetregister的时机,就显得很重要了。如果是在运行时register,则用户可能会感觉到卡顿。所以,ARouter选择了在编译时期register。这样就算编译几十分钟,用户也感觉不到,体验感就会上去。

(3)一句话总结编译期框架的特点:

在需要处理的类上加特定的注解,编译时期即可针对这些加了注解的类,做一些特定的操作。这些操作,是编译时期完成的,而非运行时期。

ARouter就是,先把需要通信的类如Activity加上Path注解,后在编译时期,这些类就会注册到路由表里面,从而实现通信

其他的编译器的框架:Eventbus,Dagger2,Room,Butterknife,DataBinding

2.APT:能在编译器干活的一个工具

APT全程是Annotation Processing Tool,即注解处理器。它是一种处理注解的工具。

(1)APT怎么工作的

在编译时期,APT会对源代码文件进行全盘检测,并找出其中符合要求的Annotation(注解),根据这些Annotation,自动生成代码。

像上面提到的(Eventbus,Dagger2,Room,Butterknife,DataBinding)这些编译期框架,尤其是ARouter,都是用到了APT技术

(2)APT工作的方式

APT工作的方式即生成代码的方式
①传统方式:如EventBus。即一行一行的写代码,按顺序写。这样可读性很强,但是容易出错,且没有用到面向对象的思维。
如图为EventBus源码片段
在这里插入图片描述

②JavaPoet方式(编译期框架的主流APT方式)
ButterKnife,ARouter等,优点是用到了面向对象的思维,且不用手动导包,缺点是可读性不强

(3)介绍下JavaPoet

它也是一个框架,但是它和传统方式的区别是:JavaPoet不需要我们手动导包,而且最重要的是,JavaPoet用到了面向对象的思维,它提供了一整套api去生成文件,而不是全部用代码写出来。打个比方

传统方式可能这样去new
Class clazz = new Class();
而JavaPoet这样去new
createObject("Class").name("clazz")
我只是打个比方,JavaPoet的语法并不是这样的,但是类似这种思想

但是它很大的缺点就是可读性不强,和习惯相反。如果生成的代码很复杂,就很恼火了。

传统方式是先导包,后创建类,创建方法,EventBus就是这样
但是JavaPoet就正好相反,先写方法,后写类,最后写包。和我们的习惯正好是相反的,是倒序的。这也是面向对象思维的体现。

也就是说它的流程是这样的
①先写一个方法a
②创建类TestClass,把方法a丢进去,像这样:TestClass(a)
③创建包TestPackage,把类TestClass丢到包里面去,像这样:TestPackage(TestClass)

在github上,JavaPoet官方附上了一段模板。比如想生成如下的代码
在这里插入图片描述
则相应的JavaPoet语法是这样的
在这里插入图片描述

(4)ARouter中是如何用到APT的?

假如说有A模块和Main模块。A模块要和Main模块中的某一个类通信。那么可以在Main模块的相应类上面加上ARouter注解,在编译期,APT会检测到这个注解,并且利用JavaPoet生成Main模块这个特定类的路由类。A模块想和Main模块通信,就可以先通过这个编译期生成的路由类,然后进行相应操作。如图
在这里插入图片描述
一般来说,根据注解,利用JavaPoet,生成的简单路由类是这样(假如MainActivity2是Main模块中需要被通信的类)
在这里插入图片描述
里面的参数path是用户去传的。到时候需要通信比如跳转页面的时候,就可以先编译,后通过目标类根据注解生成的类的方法,得到目标类的Class对象,即可完成跳转
如图

在这里插入图片描述
这就是ARouter跳转的基本原理

3.github上ARouter的总观

在这里插入图片描述
核心的,我认为就三个模块。我在这里,极其简单的抽象一下这里面的功能
arouter-annotation是各种注解,比如ARouter中的PathGroup啊等等。
arouter-compiler是注解处理器,也就是用JavaPoet写代码的地方。它是一个服务,只要发生了编译,这个服务就开始干活,也就是找到相应的注解,并且生成代码。
arouter-api是一些方法,比如ARouterGroup接口,和ARouterPath接口

Group就是组,比如app组,common组等等。Path就是组里面的一群小弟。比如app/MainActivity1,app/MainActivity2。这两个Activity同属于app组,但是是不同的Path

下一篇文章,会具体介绍ARouter的Path和Group注解,以及他们具体是怎么工作的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值