此文属于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 来替代。

我所理解的Android模块化(四)——常见问题和注意事项_第1张图片
  需要改成 下面的代码

        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模块则会出现下图这样的提示:

我所理解的Android模块化(四)——常见问题和注意事项_第2张图片

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

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

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

更多相关文章

  1. android基础知识17:Android设备常见问题与测试要领
  2. flutter与android混合开发一:Android原生项目创建flutter模块、An
  3. React Native封装Android原生UI和Android原生模块,并且集成腾讯云
  4. android 项目中接入flutter模块(部分页面)
  5. 自定义android模块不编译的问题
  6. 在Android studio 项目中使用 9patch常见问题解决
  7. Android 源码编译如何确定模块安装的位置
  8. 编译Android内核模块
  9. arcgis for android常见问题回答

随机推荐

  1. 关于Activity的少许细节
  2. 简单实现Android绘图板
  3. 屏幕触点
  4. [置顶] Android(安卓)Material Design学
  5. Androiid
  6. Android(安卓)recovery 原理分析
  7. Android高手进阶教程(九)之----Android(
  8. Android中如何获取字符或者字符串的宽度
  9. Android观察者模式实例分析
  10. Android(安卓)Studio 快捷键 (Mac OS X)