特点:
1、0个类0行代码(除了apt及生成的仅仅一个类的代码)
2、0反射0性能损耗,基于编译期间注解处理器
3、支持任何类型的参数传递,没有原生Intent的数据大小限制
4、支持页面元素共享的转场动画
用法
那么,既然敢说极简,到底有多简单呢,来看看用法:
1、@Router(C.USER_INFO)注解参数 USER_INFO = "userInfo"; 就是当前页面的actionName简称。
2、@Extra(C.HEAD_DATA)注解标注上个界面传进来的参数user信息,注解内的值就是取值时的key。
3、@SceneTransition(C.TRANSLATE_VIEW)注解标注上个界面传过来的共享元素转场动画的View。
除了这个注解 ,就没有其他任何代码了。
使用时,也就一句话:
TRouter.go(C.USER_INFO, new ExtraData(C.HEAD_DATA, SpUtil.getUser()).build(), im_face);
对于不传参的就更简单了:
TRouter.go(C.FEED_BACK);
再看看之前的写法:
ActivityCompat.startActivity(mContext, new Intent(mContext, UserActivity.class) .putExtra(C.HEAD_DATA, SpUtil.getUser()) , ActivityOptionsCompat.makeSceneTransitionAnimation( (Activity) mContext, im_face, C.TRANSLATE_VIEW).toBundle());
于是,这些代码都可以注释掉删掉啦:
当然,重构前的目标Activity里的初始化代码,也可以删掉啦:
为什么删掉呢,因为,这些极具规律性的代码,不需要手写,全部由APT自动生成了。
原理
来看看我们的TRouter里自动生成的页面跳转:
以及自动给目标Activity自动初始化传参和转场View的代码:
整个TRouter的原理,就是让Apt帮我们写代码。
先根据注解整理出需要的信息:
然后按照固定套路生成代码就可以了,例如:
具体代码请看RouterProcessor。因为逻辑并不复杂,为了保持简洁,没有像ButterKnife那样针对每个目标单独生成代理类,直接生成全局的静态方法即可,只需要保证初始化赋值目标是Public即可,而ButterKnife的代理类实在同一个包名下,则没有这样的要求,但是ButterKnife的代理类的获取需要用反射,两种实现方式各有利弊吧。
好了 ,2016年最后一趟车即将到站了,所有代码在项目T-MVP。
题外,TMVP一直在不断推翻,不断优化,不断重写,感兴趣的可以关注我的github看到最新的进展。TMVP全家桶现有TRecyclerView、TRouter、OkBus等。
QQ群:AndroidMVP 555343041
更新日志:
2017/1/31:AOP新增SysPermissionAspect支持动态申请系统权限切片,轻松适配6.0+
2017/1/27:AOP新增DbRealmAspect支持Realm数据库,数据库突破你想像的简单(年夜特供)
2017/1/8: 使用Apt封装Retrofit生成ApiFactory替换掉所有的Repository,狂删代码
2017/1/7: 使用DataBinding替换掉所有的ButterKnife,狂删代码
2017/1/6: 使用DataBinding替换掉所有的ViewHolder,狂删代码,从此迈向新时代
2016/12/30:使用Apt生成全局路由TRouter,更优雅的页面跳转,支持传递参数和共享view转场动画
2016/12/29:去掉BaseMultiVH新增VHSelector支持更完美的多ViewHolder
2016/12/28:使用Apt生成全局的ApiFactory替代所有的Model
2016/12/27:增加了BaseMultiVH扩展支持多类型的ViewHolder
2016/12/26:抽离CoreAdapterPresenter优化TRecyclerView
安卓AOP实战:面向切片编程
Android实用技巧之:用好泛型,少写代码
安卓AOP实战:APT打造极简路由
全局路由TRouter,更优雅的页面跳转
安卓AOP实战:Javassist强撸EventBus
加入OkBus,实现注解传递事件
安卓AOP三剑客:APT,AspectJ,Javassist
1、去掉所有反射>2、新增apt初始化工厂,替换掉了dagger2。>3、新增aop切片,处理缓存和日志