安卓AOP實戰:APT打造極簡路由
特點
1、0個類0行代碼(除了apt及生成的僅僅一個類的代碼)
2、0反射0性能損耗,基于編譯期間注解處理器
3、支持任何類型的參數傳遞,沒有原生Intent的數據大小限制
4、支持頁面元素共享的轉場動畫
用法
那么,既然敢說極簡,到底有多簡單呢,來看看用法:
目標Activity注解
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里的初始化代碼,也可以刪掉啦:
刪掉重構前的目標Activity里的初始化代碼
為什么刪掉呢,因為,這些極具規律性的代碼,不需要手寫,全部由APT自動生成了。
原理
來看看我們的TRouter里自動生成的頁面跳轉:
TRouter
以及自動給目標Activity自動初始化傳參和轉場View的代碼:
自動初始化
整個TRouter的原理,就是讓Apt幫我們寫代碼。
先根據注解整理出需要的信息:
RouterActivityModel
然后按照固定套路生成代碼就可以了,例如:
APT生成代碼
具體代碼請看RouterProcessor。因為邏輯并不復雜,為了保持簡潔,沒有像ButterKnife那樣針對每個目標單獨生成代理類,直接生成全局的靜態方法即可,只需要保證初始化賦值目標是Public即可,而ButterKnife的代理類實在同一個包名下,則沒有這樣的要求,但是ButterKnife的代理類的獲取需要用反射,兩種實現方式各有利弊吧。
好了 ,2016年最后一趟車即將到站了,所有代碼在項目 T-MVP 。
題外,TMVP一直在不斷推翻,不斷優化,不斷重寫,感興趣的可以關注我的github看到最新的進展。TMVP全家桶現有TRecyclerView、TRouter、OkBus等。
更新日志:
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
來自:http://www.jianshu.com/p/6ccfa7b50f0e