EasyRouter源码解析---仿Arouter路由的简洁版

手写路由框架原因

为什么市面上由如Arouter这样优秀的路由框架了,还要自己去手写路由框架呢?

  1. Arouter框架大而全,会比较臃肿,很多功能其实我们并不需要,我们完全定制属于自己的路由;
  2. 路由框架中有很多知识点需要我们综合运用,比如AutoServiceJavapoet,注解,反射;
  3. 对路由框架源码有更清晰的认识和理解。

之前在项目中用ARouter比较多,看了ARouter的源码,也是似懂非懂,过了一段时间就忘了。也想自己手撸一个路由框架出来,但一直没法将ARouter的核心框架抽离出来。百度google了很多帖子,对ARouter框架解析最清晰,说得最清楚的,当属EasyRouter的作者夏盛明了。

github地址是 https://github.com/Xiasm/EasyRouter
目前本人也参与了EasyRouter的维护,近期在EasyRouter中加入了拦截器功能,修复了少许bug。作者在github有好几篇博客写得非常好,但是比较尴尬的是,博客中图片丢失了,我根据自己的理解,画了两张图,这样对EasyRouter源码理解起来就会更清晰明了。

EasyRouter路由模块解析

EasyRouter源码解析---仿Arouter路由的简洁版_第1张图片
EasyRouter有三个核心的模块,easy-annotationeasy-compilereasy-coreeasy-annotation主要用于放置注解的类型。easy-compiler是注解处理器,通过配合AutoServicejavapoet,在编译期生成部分java文件。

EasyRouter路由逻辑流程

编译期做了什么

EasyRouter源码解析---仿Arouter路由的简洁版_第2张图片
这里我是从编译期和运行期来区分的。
在项目的编译期,通过AutoService生成javax.annoation.processing.Processor文件,实现了服务发现机制。
EasyRouter源码解析---仿Arouter路由的简洁版_第3张图片
当外部程序装配这个模块的时候,通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,这里主要是ExtraProcessor, InterceptorProcessor, RouterProcessor。然后配合javapoet,生成文件,完成模块的注入。
EasyRouter源码解析---仿Arouter路由的简洁版_第4张图片

运行期做了什么

初始化

扫描所有.class文件,将路由分组类和拦截器类都添加到全局的Map集合中:EasyRouter源码解析---仿Arouter路由的简洁版_第5张图片
其次,在子线程中遍历初始化每个拦截器的init()方法:
EasyRouter源码解析---仿Arouter路由的简洁版_第6张图片

开始路由

存放传递的数据

生成EasyRouter单例和Postcard实例,并将要传递的数据存放到Postcard的Bundle类中:
EasyRouter源码解析---仿Arouter路由的简洁版_第7张图片
EasyRouter源码解析---仿Arouter路由的简洁版_第8张图片

执行拦截器逻辑

EasyRouter源码解析---仿Arouter路由的简洁版_第9张图片
EasyRouter源码解析---仿Arouter路由的简洁版_第10张图片
在子线程中按照优先级依次执行所有拦截器的process()方法,这里用到了递归和CountDownLatch类。

准备卡片

这里主要是实现路由的按需加载功能,以及将全局静态Map中的目标跳转Class对象,以及需要传递的数据等,都设置到Postcard对象中:
EasyRouter源码解析---仿Arouter路由的简洁版_第11张图片

最终跳转

最终跳转的话,无非就是读取postcard中需要跳转的目标Activity的class对象,以及要传递到目标Activity中的数据,以及跳转动画:
EasyRouter源码解析---仿Arouter路由的简洁版_第12张图片

至此,EasyRouter已全部分析完,EasyRouter是Arouter的简洁版,当全面理解了EasyRouter后,Arouter的核心框架都理解得差不多了。

你可能感兴趣的:(安卓进阶)