模块化原因和目的
基于对工程模块化的研究,模块之间的解耦重用,提升编译效率等目的,打算把模块化运用到工程当中;并不是基于人员扩充,易于开发等(这些估计后边会用到),因为业务发展的确实慢。通过对工程的模块化,自己也可以熟悉这个过程中的难点和问题,扩充自己在架构方面的知识;
重构过程
先上一个图:
这个是第一阶段模块化之后的模块图;
-
第一步:先把第三方库抽象出来,自己定一个个config.gradle,然后在根build.gradle里面
这样做的目的是方便管理; -
第二步:
把网络,util,自定义view,activity,fragment的抽象都抽取到baseModel中;
网络框架用的 okhttp+retrofit+rxjava,然后碰到了一个问题,就是之前http请求放到了一个httpmanager类中统一管理用到了apiInterface,apiInterface中用到了请求完成转化的类,因为时间问题(还有需求要做)还没想到好的办法,所以这两个类都暂时放到了BusinessModel中;
在写文章的过程中突然有了想法,把这两个类放到basemodel中,然后把需要json转化成的实体bean放到base中,binggo,验证可行; -
第三步:业务模块的抽取
项目是个医疗相关的app,业务逻辑主要分为医疗资讯,医生问诊,设置三大模块,还算比较清晰;
遇到的问题,解决方案
- 首先要了解,依赖都是单向的;比如,a模块依赖了b模块,a可以调用b模块中的类和方法,如果b想调用a的类和方法,b依赖了a,那么sync的时候回报错,
b如果想引用a中的方法,那么就得想办法把a中的类抽取到更低的模块中; - ButterKnife的问题;
在模块化的工程中建议不要使用,最新版本中虽然可以支持,就是引用R2,点击事件就用setOnclickListner但是我遇到了一个问题,就是在recyleview的adapter中,有多个点击事件回调的时候,我是根据R.id来判断的,但是R.id在model中不是常量。
解决办法我想到了两个:1,每个view设置一个回调;2,回调传参的时候自定义常量,每个常量代表一个事件;
为了以后更好的重构,我再工程中去掉了ButterKnife,Android code Generator这个插件可以把布局文件自动生成fragment和Activity,方便了不少;
后续改进的想法
支持工程模块单独编译,这才是真的模块化;
感悟
纸上得来终觉浅,绝知此事要躬行;自己一定要动手敲下代码,印象才算深刻;