美文网首页程序员Android开发经验谈
Android组件化开发实践(七):开发常见问题及解决方案

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

作者: 云飞扬1 | 来源:发表于2018-10-09 15:38 被阅读227次

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

    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插件

    相关文章

      网友评论

      • 踏古今:看完了这个系列文章,不知道是我理解问题还是怎的。个人认为作者讲得不算真正的组件化,组件之间不能有任何依赖,为了解决数据共享,作者有用到eventbus,这样的话,通信之间的两个模块都必须引入eventbus,轻微耦合。路由传参可以解决一部分共享问题,但是真正的组件化,组件之间可以面向接口编程共享数据,共享view,动态加载卸载组件。同时任意一个组件都可以单独运行调试。上一篇里面,在壳的application里面直接引用modulea.b.c初始化applitionlike,那如果只要modulea,或者想卸载一个组件,岂不是得改代码依赖。组件化里面还有最重要的一环grade插件。。。
        云飞扬1:你的理解是对的,组件间数据通信最好是不用EventBus之类,比较好的方案是SPI技术(Service Provier Interface),这个在ARouter、美团的WMRouter里都有用到。我写这些文章,是希望由浅入深,逐步去理解这些概念,初期用的都是大家平常使用的东西,因为我也是从这个过程过来的。就像你说的,我说的ApplicationLike类,需要在壳工程里硬编码,肯定是不灵活的,我只是为了表达这个意思,这里可以用APT技术、配合自己编写gradle插件来实现,自动注册加载组件。相信编写gradle插件、APT技术等等,这些对大部分没接触过的人来说, 上手难度应该还是挺大的,前期可以短暂的用这种方式过渡,先把整个框架搭建起来,后面再一步一步完善,毕竟很多公司里可能只是专注于做业务,没有专门的架构设计团队,业务开发还是第一要务的。
        这些是我的一些理解,不过后面我得抽时间,把gradle插件、APT相关的实践方案写下来,欢迎一起交流。
      • Mr_panmin:向前辈学习

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

      本文链接:https://www.haomeiwen.com/subject/nqlwnftx.html