当前位置:网站首页>组件化学习(2)Arouter原理学习
组件化学习(2)Arouter原理学习
2022-04-23 06:07:00 【独饮敌敌畏丶】
1.Arouter原理
(1)一句话总结ARouter的原理:
就像上篇文章讲到的全局Map一样,它有一个在编译期生成的路由表。虽然各模块之间没有横向依赖,但是信息传递的时候,可以通过查找路由表,找到需要通信的模块的class对象,从而进行通信。也就是说ARouter的核心就是路由表
(2)ARouter是编译期的框架
既然有表,那就有表中元素的register和get。register的时机,就显得很重要了。如果是在运行时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中的Path啊Group啊等等。
arouter-compiler是注解处理器,也就是用JavaPoet写代码的地方。它是一个服务,只要发生了编译,这个服务就开始干活,也就是找到相应的注解,并且生成代码。
arouter-api是一些方法,比如ARouterGroup接口,和ARouterPath接口
Group就是组,比如app组,common组等等。Path就是组里面的一群小弟。比如app/MainActivity1,app/MainActivity2。这两个Activity同属于app组,但是是不同的Path
下一篇文章,会具体介绍ARouter的Path和Group注解,以及他们具体是怎么工作的
版权声明
本文为[独饮敌敌畏丶]所创,转载请带上原文链接,感谢
https://blog.csdn.net/afdafvdaa/article/details/121665010
边栏推荐
猜你喜欢

Dolphinscheduler配置Datax踩坑记录

搭建基于OSS的图片分享网站-反馈有礼

Typical application scenarios of alicloud log service SLS

Memcached source code analysis

Chaos takes you to the chaos project quickly

Build a cloud blog based on ECS (polite experience)

冬季实战营 动手实战-初识上云基础,动手实操ECS云服务器新手上路 领鼠标 云小宝 背包 无影

Oracle Job定时任务的使用详解

个人博客网站搭建

Thanos compact component test summary (processing historical data)
随机推荐
Arranges the objects specified in the array in front of the array
JS function package foreach use return can not jump out of the outer function
Oracle索引状态查询与索引重建
一个DG环境的ORA-16047: DGID mismatch between destination setting and target database问题排查及监听VNCR特性
When switch case, concatenate the error case and if of the conventional judgment expression and use L
Winter combat camp hands-on combat - first understand the cloud foundation, hands-on practice ECS ECS ECS novice on the road to get the mouse cloud Xiaobao backpack shadowless
中国各省会城市经纬度位置
Binder机制原理
pycharm Install packages failed
JVM basics you should know
oracle分区的相关操作
RAC环境中openssh版本对SSH互信创建的影响
Tiny4412 HDMI显示
Chaos带你快速上手混沌工程
冬季实战营 动手实战-初识上云基础,动手实操ECS云服务器新手上路 领鼠标 云小宝 背包 无影
Oracle RAC数据库实例启动异常问题分析IPC Send timeout
Prometheus cortex Architecture Overview (horizontally scalable, highly available, multi tenant, long-term storage)
Oracle锁表查询和解锁方法
常用于融合去重的窗口函数row_number
Abnormal record-15

