2015-06-24 100 views
0

我正在编写一些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个空白字符?

+1

你试过用'contains'而不是'equals'吗?或者在比较之前使用'trim()'从两个字符串中删除不必要的空间 –

+0

'runOnUiThread(new Runnable {'gross。更新'AsyncTask'提供的方法中的UI – codeMagic

+0

不知道为什么额外的字符会在那里,你试过调用'currentEula = currentEula.trim()'去除空格?如果它们只是空格,你可以安全地删除它们,如果它们碰巧不是空格,trim不会删除它们。 –

回答

1

您可以存储当前EULA的当前EULA +散列。

然后,您可以比较哈希值以查看EULA中是否发生了变化。

+0

我认为这实际上可能是最初的最佳方式。是String.hashCode()足够这个,或者我需要写我自己的散列函数? –

+0

@ user3174484它应该就足够了。试一试。或者看看这个问题http://stackoverflow.com/questions/6120657/how-to-generate-a-unique-hash-code-for-string-input-in-android – LordRaydenMK

+0

似乎他们哈希不同以及由于额外的字符,但我可能会把它与上面的String.trim()建议结合起来,得到一个不涉及9000+字符串哈哈的工作解决方案。谢谢您的帮助! –