1

我昨天部署了我的一个应用程序的新版本。今天早上我在市场仪表板上报告了几个 ClassCastExceptions。发生异常是因为我的 java 代码使用 findViewById 来检索我要转换为 Button 的元素。这引发了一个异常,因为检索到的元素实际上是一个 LinearLayout。为了解决这个问题,我从 eclipse 中获取了我最新生成的 R 文件的副本并将其保存在文本文件中。我清理了项目并获取了 R 的新副本并进行了比较。与某些小部件关联的 id 确实不同。按钮的 id 是 LinearLayout 的 id。我认为将这个清理过的项目部署到生产环境现在可以解决这个问题。我的问题是我的代码是如何在 R 文件和 xml 之间断开连接的情况下在本地运行的?在我部署之前,我会确保在未来运行一次清理,但这似乎是一个错误。

4

1 回答 1

1

我的问题是我的代码是如何在 R 文件和 xml 之间断开连接的情况下在本地运行的?

您的问题不在于“R 文件和 xml 之间的断开连接”。

您的问题是“R 文件”与您的其余代码之间的断开连接。

中的值R.java标记为静态最终值。因此,实际数字被内联到引用这些值的任何类的字节码中。有时,Android 会更新R.java文件,但不会清除项目中引用旧R.java文件的预编译类。现在,任何更改的值都R.java将与那些先前编译的类不同步。根据这些错误,您将遇到各种错误,例如由于调用ClassCastException而导致的错误。findViewById()

至于您如何在本地运行它,唯一的答案是您运行的 APK 与您上传的 APK 不同。

在我部署之前,我会确保在未来运行一个干净的

这是一个绝妙的主意。如果您选择为您的生产 APK 生成进行命令行构建,只需添加clean到您的 ant 目标列表中。

但这似乎是一个错误

这当然是构建工具的一个恼人的限制。请注意,这也会影响命令行构建过程。回到过去的美好时光,当我不使用 Eclipse 时,我只会clean在每次构建时都做一个(现在,那将是ant clean debug install)。

于 2011-11-25T13:31:45.290 回答