当前位置:   article > 正文

Android组件化开发实践(七):开发常见问题及解决方案

android 组件化开发 业务组件实体问题

我们在单一工程里开发时代码运行良好,但是在进行组件化开发时,经常会出现一些莫名其妙的问题。

1. ButterKnife无法使用

组件化之后,在library中使用ButterKnife,会发现引用R.id的地方都会飘红报错:

img_11c243181b731e254b1bfa85a2c8fb2e.png

查看错误原因都是:Attribute value must be constant。这是因为在library中生成的R文件,这些属性值都不是常量,而@BindView注解这里是需要传入常量值的,我们找到R.id类看看:

img_3b0366b8e686cb20df7486583a3cf743.png

从图中可以看到,这些id都是 public static int 类型的,所以这些地方都会报错,ButterKnife提供了插件来解决这个问题。

  • 在项目的build.gradle里增加配置:
  1. dependencies {
  2. classpath 'com.android.tools.build:gradle:3.0.1'
  3. classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
  4. }

注意gradle使用的版本号为3.0以上,butterknife-gradle-plugin的版本号为8.4.0,特别注意不要使用最新的版本,8.4.0刚刚好,否则总是编译报错。

  • 在module的build.gradle里声明插件:
apply plugin: 'com.jakewharton.butterknife'
  • 在module的build.gradle里增加依赖:
  1. compile 'com.jakewharton:butterknife:8.4.0'
  2. annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
  • 使用R2而不是R

img_39d5def18ad263697b472a32bb2a4ae1.png

我们看看R2文件里的id,发现里面都是 public static final int类型常量值了,这些都是是插件为我们生成。

img_21652df1f607d91732f81f5d37e01c6a.png
  • click事件
img_cf123e9edfdebd2741cbb57577196b35.png

同样,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插件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/240033?site
推荐阅读
相关标签
  

闽ICP备14008679号