我们在单一工程里开发时代码运行良好,但是在进行组件化开发时,经常会出现一些莫名其妙的问题。
1. ButterKnife无法使用
组件化之后,在library中使用ButterKnife,会发现引用R.id的地方都会飘红报错:
查看错误原因都是:Attribute value must be constant。这是因为在library中生成的R文件,这些属性值都不是常量,而@BindView注解这里是需要传入常量值的,我们找到R.id类看看:
从图中可以看到,这些id都是 public static int 类型的,所以这些地方都会报错,ButterKnife提供了插件来解决这个问题。
- 在项目的build.gradle里增加配置:
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
}
注意gradle使用的版本号为3.0以上,butterknife-gradle-plugin的版本号为8.4.0,特别注意不要使用最新的版本,8.4.0刚刚好,否则总是编译报错。
- 在module的build.gradle里声明插件:
apply plugin: 'com.jakewharton.butterknife'
- 在module的build.gradle里增加依赖:
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
- 使用R2而不是R
我们看看R2文件里的id,发现里面都是public static final int类型常量值了,这些都是是插件为我们生成。
- click事件
同样,click事件里也必须采用R2.id来替换R.id,但是onClick()方法里不能使用switch case语句,必须使用if else来代替,在方法体内部是不能使用R2.id的,R2类只限于在外部注解中使用。
2. 组件生命周期自动注册加载
在组件生命周期管理这篇文章中,我介绍了组件都有一个自己的类似Application类,但是会引入一个问题:在壳工程集成各种业务组件时,会存在硬编码的问题,耦合严重,违背了组件化的初衷。为了解决该问题,我们可以采用APT技术,以及通过自定义gradle插件,在打包编译期间通过动态插入字节码的方式,实现组件生命周期类的自动注册加载。具体实现方式可参考:Android组件化开发实践(八):组件生命周期如何实现自动注册管理。
3. 不同组件间数据如何交互
TODO...
持续更新中...
系列文章
Android组件化开发实践(一):为什么要进行组件化开发?
Android组件化开发实践(二):组件化架构设计
Android组件化开发实践(三):组件开发规范
Android组件化开发实践(四):组件间通信问题
Android组件化开发实践(五):组件生命周期管理
Android组件化开发实践(六):老项目实施组件化
Android组件化开发实践(七):开发常见问题及解决方案
Android组件化开发实践(八):组件生命周期如何实现自动注册管理
Android组件化开发实践(九):自定义Gradle插件