【发布时间】:2015-09-10 22:57:23
【问题描述】:
我正在编写一些 Android 代码,将应用程序 EULA 作为字符串下载并将其存储在 SharedPreferences 中,以便我们稍后检查。总体思路是用户只需同意 EULA 一次,但如果条款更新,我们希望通知用户并让他们再次同意。
这是一些示例代码,它发生在 AsyncTask 的 doInBackground 方法中:
String currentEula = getEulaText(); //I've confirmed this method correctly downloads the text
String oldEula = mPrefs.getString("eula_text", "");
if(!(oldEula.equals(currentEula)){
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("eula_text", currentEula);
editor.commit();
runOnUiThread(new Runnable {
@Override
public void run() {
showEula() //this handles the actual agreement stuff, works correctly
}
}
}
但是,在此示例中,currentEula 和 oldEula 永远不会相等,因此每次打开应用程序时都会显示 EULA。当我打印两个字符串的长度时,我发现来自 mPrefs 的字符串比下载的字符串长 4 个字符。我添加了一个日志语句来打印 4 个额外的字符,它们是空白的。如果我比较字符串的其余部分,它们是相等的。
更奇怪的是,在调用 editor.commit() 之后,这个比较是正确的:
mPrefs.getString("eula_text", "").equals(currentEula);
因此,从 mPrefs 检索到的字符串的值在此函数结束和再次调用它的时间之间发生变化,但我已经确认应用程序的其他部分没有触及“eula_text”值(即使是的,为什么它会在末尾添加四个空格?)。
我可以在从 mPrefs 中检索到 String 后去掉最后 4 个字符,但我担心它们可能并不总是空白。或者,我可以做这个比较:
oldEula.substring(0, currentEula.length()).equals(currentEula)
但是,在 EULA 更新只是删除最后一项的情况下,这会产生误报(不太可能,但仍有可能)。有谁知道为什么我的字符串会随机添加 4 个空白字符?
【问题讨论】:
-
你试过用
contains代替equals吗?或使用trim()在比较之前从两个字符串中删除不必要的空格 -
runOnUiThread(new Runnable {总。在AsyncTask提供的方法中更新UI -
不确定为什么会有多余的字符,但是您是否尝试过调用
currentEula = currentEula.trim()来删除空格?如果它们只是空格,您可以使用 trim 安全地删除它们,如果它们恰好不是空格,则 trim 不会删除它们。 -
另外,
mPrefs.getString("eula_text", "").equals(currentEula);在调用editor.commit()后评估为 true 的原因是因为您所做的存储在首选项中currentEula,覆盖没有空格的版本,并检索确切的稍后您刚刚输入的字符串,所以它现在当然会评估为真。 -
currentEula.trim() 似乎确实解决了问题,所以这是个好消息。