以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
[Android]如何做一个崩溃率少于千分之三噶应用app(1)-module工程架构
[Android]如何做一个崩溃率少于千分之三噶应用app(2)-完全退出App
[Android]如何做一个崩溃率少于千分之三噶应用app(3)-极速编译
[Android]如何做一个崩溃率少于千分之三噶应用app(4)-极速编译*续
[Android]如何做一个崩溃率少于千分之三噶应用app(5)-极速增量编译
这章的名字是《动态创建》
为何要使用动态创建?
其实就是用来降低对于其他module的类的耦合
我们工程很多时候都会依赖于别的工程模块,例如我们需要增加一个功能模块的时候,就需要里面的一些Fragment Activity等资源,倘若我们有一天不想要这些资源了,去除这个依赖,那去除这些资源的引用,可能需要很多的时间,那这样也违反我们设计的初综,尽量可以不修改原有的代码。(对扩展开放,对修改关闭)
可以用这个界面想象一下,我们如果需要添加多个模块,或者多个模块需要如何去做才能降低依赖的耦合。
这里是我的做法
1.将每个功能做成一个单一的module
其中record_read,reocord_record,record_settings都是libs的module
app会统一管理这些module
2.用一个主的Activity管理引用这些Fragment,我这里用到的是ViewPager
(1)Fragment的地址用String的数组存储
(2)通过反射创建,添加到ViewPager
Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作
这样做就不用import相应的包到主工程。
然后如果去除相应的包的时候,只需要在Fragment的地址用String的数组去除,添加一个新功能也同样如此,极大降低工程对其他功能的耦合。
就算地址依赖不存在了,保持原有代码,也会第一次时间被try catch处理,不会导致崩溃。
当然这个也有其局限性
1.就是使用newInstance来初始化对象,其无法使用有参的构造,对比于我们平时用new创建对象。
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。
2.当然newInstance也是可以通过反射使用参数版本的构造的,只是稍显复杂一点,效率也不高就是了。
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。
3.创建的效率会牺牲一点,但是会更加安全。
********************2016.11.23更新*********************
我在ModuleBus交互提供了交互的新的module交互框架里面,动态创建的运用的例子,有兴趣的话,可以查看一下。
这章就到这里啦,希望对大家有构建工程的时候有帮助。
下一章会介绍更奇妙的内容,就是不相互依赖的module如何通信,敬请期待。
********************2019.2.13更新*******************
这里存在着取舍,如果要优化耦合就用上面说的方式。
如果要优化效率,只能使用类似于ARouter路由方案的,Fragment获取+IProvider接口调用。缺点是base模块放置接口文件,实现在功能module