前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android模块化专题(四), 常见问题和注意事项

Android模块化专题(四), 常见问题和注意事项

作者头像
开发者技术前线
发布2020-11-23 16:10:54
5510
发布2020-11-23 16:10:54
举报

明天就是元旦假日,本文本号是2017年最后一篇技术文。本文是对模块化专题介绍的系列文章,包含了以下四部分:《我所理解的Android模块化(一)—概念和路由》,《我所理解的Android模块化(二)—模块通信和模块间服务调用》,《我所理解的Android模块化(三)—模块可插拔单独编译运行》,《我所理解的Android模块化(四)—常见问题和注意事项》。以连载3篇欢迎读者持续关注。

前面已经写了两三Android模块化的博客,主要讲到了模块化的跳转路由,模块间通信和模块间服务调用。

我所理解的Android模块化(一)》;

我所理解的Android模块化(二)》;

我所理解的Android模块化(三)》;

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

注意事项

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

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

常见问题

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

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

需要改成 下面的代码

代码语言:javascript
复制
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修饰

代码语言:javascript
复制
public static int tv_login_state = 0x7f0c0064;
  public static int tv_usercenter = 0x7f0c0065;

  app 模块中的id有final修饰

代码语言:javascript
复制
public static final int right_side=0x7f07005d;

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

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

代码语言:javascript
复制
classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'

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

apply plugin: ‘com.jakewharton.butterknife’ annotationProcessor ‘com.jakewharton8.8.1’

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

代码语言:javascript
复制
@BindView(R2.id.rg_tab)
RadioGroup rgTab;

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

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

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

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

至此Android模块化的大部分内容都讲解的差不多了,想看具体如何做法的话请看

示例项目:https://github.com/finddreams/AndModulePractice

作者:finddreams http://blog.csdn.net/finddreams/article/details/78339809 本文已独家原创发布,转载请联系原作者

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开发者技术前线 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注意事项
  • 常见问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档