Android Library 和 IDs 的爱恨情仇 | 掘金技术征文

版权声明:java

本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。android

未经容许,不得转载。模块化

1、前言

由于业务须要,须要把手上一个项目,按模块拆分出来,进行模块化处理,来适应不一样的版本需求。大体的流程就是按模块化的思想,将各个业务进行拆分,总之就是一堆解耦的操做。模块化的好处有不少,这里就不一一说明了。设计

肯定好须要拆分的模块以后,其实具体业务代码都是现成的,只是须要制定好接口,而后"有技巧"的复制现有代码到各个该在的模块内就能够了。在这个过程当中,碰到一些问题,在一些原有代码中,使用 switch-case 操做一些 IDs 的资源的时候,本来是没有问题的,可是当它被复制到 Android Library 中的时候,就开始提示错误了,表示没法这样使用,下面就这个问题来进行一个简单的讲解,并提供一个快速解决的方法。3d

2、为何会有这样的问题?

咱们先来看看报错信息。code


点击查看更多『more』。


能够看到错误的说明。这里明说了,没法在 Android Library 中,使用 switch 语句,来操做一个 IDs 的资源。

那么是什么致使出现这样的问题呢?cdn

咱们知道,switch 语句的 case 操做必须是一个常量。而在 App Module 中,IDs 自己在 R.java 中就是被定义为一个一个常量而存在的,那么在 Android Library 中,这一点是否会有变化呢?blog

先来看看 App 的 R.java。接口


再来看看 Android Library Module 中生成的 R.java 文件。


能够看到,确实是有不同的,在 Android Library Module 中,生成的 R.java 文件中,全部的 IDs 都是 static 的,而非 static final 的。也就是说,它再也不是一个常量了。

而官方其实也有资料来讲明这个问题。ip

tools.android.com/tips/non-co…

有兴趣的能够直接阅读原文,大体的意思是在 SDK Tools r14 开始,在 Library Module 中,会将 IDs 的资源,声明为 static 而非 static final 。

而这么设计的缘由是,在多个 Module 组合的项目中,若是须要确保每一个 Module 中的 IDs 资源的值在整个项目中都是惟一的话,就须要每次编译的时候都将全部的资源和相关的 Java 代码与主项目一块儿从新编译,为每一个 IDs 的资源,都生成一个惟一的值,这样就会影响构建的效率。同时它也限制了发布 Android Library 就必须发布源码,从而限制了 Android Library 的使用范围。因此在 SDK Tools r14 开始,就将 Android Library 中的 IDs 标记为非 final 类型的。

3、如何快速替换 Switch 语句

而官方也提供了解决方案,就是使用 if-else 语句替换 switch-case 语句。若是咱们是从零开始编写逻辑,直接使用 if-esle 来编写这种逻辑便可,可是咱们是在 copy 一个现有的项目,那么问题就变成了,如何快速的将 switch-case 替换为 if-else 语句。

在 Android Studio 中,是提供了快捷键来一键替换的。若是没有修改过,在 Mac 中,快捷键是 command + return ,在 Windows 中,快捷键是 Alt + Enter


若是快捷键有变更,能够在 KeyMap 中,查找 Show Intention Actions ,查看被设置的快捷键。


而 Intention 实际上提供了很是多的快捷操做,这里只是命中了当前 switch 替换 if 的场景了而已,更多的快捷操做,能够在 Intentions 窗口中查看。

4、结语

自己这样的一件事情,根据 提示就解决了,可是做为开发者,不该该只是知足解决问题,应该从更深层次的来探讨问题的缘由,为何如此设计,如何快速的解决这个问题。

公众号二维码.jpg
相关文章
相关标签/搜索