Android SharedPreferences:存储的字符串与String检索的长度不同?

时间:2015-06-24 16:10:31

标签: java android string

我正在编写一些Android代码,将应用程序EULA作为String下载并将其存储在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检索的String的值在此函数的结尾与再次调用它的时间之间发生变化,但我确认应用程序的其他任何部分都没有触及" eula_text&# 34;价值(即使它确实如此,为什么在地球上它只会在结尾添加四个空格?)。

从mPrefs中检索后,我可以从String中删除最后4个字符,但我担心它们可能并不总是空白。或者,我可以做这个比较:

oldEula.substring(0, currentEula.length()).equals(currentEula)

然而,如果EULA更新只是剥离最后一项(不是很可能,但仍然可能),这会产生误报。有谁知道为什么我的String会随机添加4个空白字符?

1 个答案:

答案 0 :(得分:1)

您可以存储当前EULA的当前EULA +哈希值。

然后你可以比较哈希值,看看EULA是否有变化。