我所理解的Android模块化(四)——常见问题和注意事项

此文属于finddreams的原创博客,转载请注明出处:http://blog.csdn.net/finddreams/article/details/78355998

  《我所理解的Android模块化(一)——概念和路由》
  《我所理解的Android模块化(二)——模块通信和模块间服务调用》
  《我所理解的Android模块化(三)——模块可插拔单独编译运行》
  《我所理解的Android模块化(四)——常见问题和注意事项》

   关于Android模块化,前面已经写了三篇文章,没有了解的大家可以先去看一下,附上链接地址:

  下面主要来说一下Android模块化过程中的常见问题和注意事项:

注意事项

  记得在一篇技术博客中看到微信Tinker的开发人员说过一句话:“热更新不是请客吃饭!”,说的很有道理。虽然模块化没有热更新那么多兼容性问题,那么多坑,因为模块化完全是利用AndroidStudio自带的gradle的方式编译来实现多模块,所以不会存在或者很少存在兼容性问题。但是项目的模块化过程也并不轻松,特别是传统的开发很久的老项目想要实现模块化必然会经历一翻阵痛,如此说来也不是一个轻松的事情,所以在开始模块化之前有很多注意事项需要清楚。

   从传统的项目到模块化重构是一个漫长的过程,不可能一蹴而就,需要在平时的开发中慢慢的重构成模块化。参与重构的开发人员必须熟悉他所重构的业务模块,熟知重构业务模块中的跳转和其他模块的交互逻辑,这样才能做到模块化的同时不会破坏原有的业务逻辑和实现,毕竟重构对于开发人员来说往往是一个非常痛苦的过程,需要毅力和决心,因为谁也不希望把原本正确的代码改坏了,但是重构完成之后,模块化的构建方式还是有助于将来的开发的,是一件非常值得的事情。

常见问题

  1.模块化项目中的onClick、onItemClick等各种回调方法中的不能使用switch (view.getId()) case语句会报错.

需要替换成 if (id == R.id.bt_login_success) else 来替代。

这里写图片描述
  需要改成 下面的代码

        int id = view.getId();
        if (id == R.id.bt_login_success) {
            EventBus.getDefault().post(new LoginStateEvent(true));
        } else if (id == R.id.bt_login_fail) {
            EventBus.getDefault().post(new LoginStateEvent(false));
        }

  为什么在library中不能使用switch , case语句,而APP中却是可以的呢?
答案是因为case分支后面跟的参数必须是常量,而library中生成的view的R.java中的资源ID不是常量,导致不能使用,而在APP中生成的ID则是有final修饰的常量。

  module_user模块中的id没有final修饰

      public static int tv_login_state = 0x7f0c0064;
      public static int tv_usercenter = 0x7f0c0065;

  app 模块中的id有final修饰

    public static final int right_side=0x7f07005d;

  2.模块化中能不能用ButterKnife框架或者已经使用了ButterKnife的项目模块化重构的时候还能不能使用?

  答案也是肯定的,但是不是十分推荐,使用原生的兼容性更好。
要想继续使用ButterKnife,首先需要在根目录build文件中导入:

        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'

  然后在想使用ButterKnife模块的build文件中引入plugin和导入库:

apply plugin: 'com.jakewharton.butterknife'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

  这样在注解@BindView的时候,只需要把R.id.rg_tab换成R2.id.rg_tab,library中R中id不是常量,所以会找不到这个id,而butterknife的插件会自动帮我们生成R2文件,里面的id是常量类型,所以只需要把R替换成R2即可。

    @BindView(R2.id.rg_tab)
    RadioGroup rgTab;

  3.如果某一个模块没有集成到主APP中来运行的时候点击这个模块会不会崩溃?

  如果模块没有集成进来,想要跳转到这个页面的时候,不会崩溃,设置debug模式的时候会出现找不到的提示,而点击属于这个模块的功能的时候则不会有反应。

  比如我们不集成module_user模块则会出现下图这样的提示:

这里写图片描述

  所以每次打包发布的时候我们都要仔细的检查一下配置,是不是所有的模块化项目都集成到了主的APP中来了,防止模块被遗漏的情况。

  至此Android模块化的大部分内容都讲解的差不多了,想看具体如何做法的话请看示例项目:https://github.com/finddreams/AndModulePractice

本文已授权开发者技术前线 独家发布 侵权必究

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值