我正在编写一些Android代码,将应用程序EULA作为字符串下载并将其存储在SharedPreferences中,以便稍后进行检查。总体思路是,用户只需同意EULA一次,但如果条款已更新,我们希望通知用户并让他们再次达成一致。Android SharedPreferences:存储的字符串与检索到的字符串长度不同?
下面是一些示例代码,它接受一个的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中取出后,我可以从字符串中去掉最后4个字符,但我担心它们可能不总是空白。或者,我可以这样做比较:
oldEula.substring(0, currentEula.length()).equals(currentEula)
然而,这会产生在最终用户许可协议的更新只是去掉最后一个项目(不是超级容易,但还是有可能)的情况下的假阳性。有谁知道为什么我的字符串会随机地粘贴4个空白字符?
你试过用'contains'而不是'equals'吗?或者在比较之前使用'trim()'从两个字符串中删除不必要的空间 –
'runOnUiThread(new Runnable {'gross。更新'AsyncTask'提供的方法中的UI – codeMagic
不知道为什么额外的字符会在那里,你试过调用'currentEula = currentEula.trim()'去除空格?如果它们只是空格,你可以安全地删除它们,如果它们碰巧不是空格,trim不会删除它们。 –