最近在学习APT技术,写了一个非常火的路由框架ARouter 来看看代码思路吧!!底部有完整代码哦!
我的环境
- 硬件: mac
- gradle: 6.5-bin
- as版本gradle:4.1.3
项目结构:
同一个颜色表示同一“等级”
组件化特性:
- 在测试环境下,各个模块独立,可以单独运行
- 在正式环境下,可以调用到各个模块的代码!
ARouter特性:
可以使单独模块互相不依赖并且可以实现通信!
例如 my 模块和find模块并没有相互的依赖,使用ARouter框架就可以互相调用
ARouter原理:
在编译期间采用了APT技术,配合javaPoet 让项目中所有的Activity生成对应的文件,将文件保存到hashMap<String,Class>中,通过key来获取到Class,获取到class就话就可以随意跳转了
- APT:注解处理技术,在编译器生成
- javaPost: 可以生成java文件
ARouter原理辅助图: my模块去util_lib, 然后util_lib去找arouter_api,找到find在表(hashMap)中注册的代码,最后找到class完成跳转
arouter_api 看命名就知道 是ARouter对外暴露的api,提供开发者来使用的!
场景:my模块需要调用find模块Activity:
来看看生成的文件:
项目介绍
- isRelease = true 正式环境下 各个独立模块不准运行!
- isRelease = false
路由跳转并携带参数使用:
在app壳之内跳转,和模块之间跳转使用是一样的!
共享图片
需求: first_page 有一张1MB的图片, find需要使用 为了节省开销,必须访问,并且禁止横向依赖
辅助图:
使用:
- 实现ARouterDrawable 接口 重写getDrawable()方法 将需要暴露的图片返回
- 添加ARouter注解
- 接收图片端 添加@Parameter
记得设置ParameterManager!
辅助图:
简单原理分析:
效果图:
共享Bean类
需求:
find模块写了一个Bean类,很重要,app要使用一下!
注意: app集成了find模块,所以能直接使用到find模块中的类,这里只是举例子!
只要对外暴露,所有模块中都可以使用到! 使用和对外暴露图片一样!
共享方法
需求: find中有一个请求网络图片的框架写的特别好,first_page 需要调用find中的网络请求框架,将路径传递给find,并且最终find返回图片请求结果给first_page!
使用:
- 1.在find中对外暴露请求网络图片框架! 并且实现ARouterMethod方法,重写getMethod()进行网络请求
- 2.在first_page 中添加注解,传递图片路径,进行异步请求,
- 设置图片
效果图:
代码细节请 star 查看!!
// true ARouter与组件化 // flase 只有组件化的代码 private static final Boolean isARouter = true
if(isARouter) ARouter与组件化完整代码 else 组件化完整代码
原创不易,您的点赞就是对我最大的支持!