Android module 实类的动态创建

1,424 阅读3分钟

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app(1)-module工程架构

[Android]如何做一个崩溃率少于千分之三噶应用app(2)-完全退出App

[Android]如何做一个崩溃率少于千分之三噶应用app(3)-极速编译

[Android]如何做一个崩溃率少于千分之三噶应用app(4)-极速编译*续

[Android]如何做一个崩溃率少于千分之三噶应用app(5)-极速增量编译

这章的名字是《动态创建》

为何要使用动态创建?

其实就是用来降低对于其他module的类的耦合

我们工程很多时候都会依赖于别的工程模块,例如我们需要增加一个功能模块的时候,就需要里面的一些Fragment Activity等资源,倘若我们有一天不想要这些资源了,去除这个依赖,那去除这些资源的引用,可能需要很多的时间,那这样也违反我们设计的初综,尽量可以不修改原有的代码。(对扩展开放,对修改关闭)

可以用这个界面想象一下,我们如果需要添加多个模块,或者多个模块需要如何去做才能降低依赖的耦合。


录制app

这里是我的做法

1.将每个功能做成一个单一的module

其中record_read,reocord_record,record_settings都是libs的module

app会统一管理这些module


2.用一个主的Activity管理引用这些Fragment,我这里用到的是ViewPager

(1)Fragment的地址用String的数组存储


不同module的Fragment地址

(2)通过反射创建,添加到ViewPager

Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作


动态加载

这样做就不用import相应的包到主工程。

然后如果去除相应的包的时候,只需要在Fragment的地址用String的数组去除,添加一个新功能也同样如此,极大降低工程对其他功能的耦合。

就算地址依赖不存在了,保持原有代码,也会第一次时间被try catch处理,不会导致崩溃。

当然这个也有其局限性

1.就是使用newInstance来初始化对象,其无法使用有参的构造,对比于我们平时用new创建对象。

newInstance: 弱类型。低效率。只能调用无参构造。

new: 强类型。相对高效。能调用任何public构造。

2.当然newInstance也是可以通过反射使用参数版本的构造的,只是稍显复杂一点,效率也不高就是了。

Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;

Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

newInstance多参数版本构造

3.创建的效率会牺牲一点,但是会更加安全。

这章就到这里啦,希望对大家有构建工程的时候有帮助。

下一章会介绍更奇妙的内容,就是不相互依赖的module如何通信,敬请期待。