存储在SharedPreferences中的字符串会在每个应用关闭时被修改吗?

时间:2018-05-17 09:30:39

标签: java android json string android-sharedpreferences

所以,自从过去24小时以来,我一直在思考这个问题,在开始之前,让我清楚地说明这个问题只出现在我的一个在marshmallow上运行的android手机上。

问题:

当我使用StringRequest检索字符串响应时,字符串正是它应该是的样式,然后我将它保存到SharedPreferences,并且无论我从SharedPreferences检索文件多少次,该值仍然是正确的(即相同)。但是,当我关闭应用程序并重新启动它,并从SharedPreferences中检索字符串时,字符串会以某种方式更改,长度减少,.equals在与从服务器新获取的相同字符串进行比较时返回false,所以我猜测SharedPreferences会修改String值在Android marshmallow中独占鳌头。 经过大量的调试,我写了两个字符串(从共享偏好和服务器)到单独的.txt文件到内部存储,并用notepad ++和Voila!打开它们,控制字符从'CR LF'改为'LF',因此导致字符串的长度发生变化,但长度不同,当我比较许多在线网站上的两个字符串时,所有字母都说“字符串完全相同!” :(

帮帮我们! 日Thnx

1 个答案:

答案 0 :(得分:1)

经过很多麻烦,我终于找到了根本原因。 在某些设备上,存储在SharedPreferences中的字符串值会修改其EOL字符。字符串中的换行符转换为\n以外的其他内容,这会减少字符串的长度。每个换行符都会将字符串的长度减少1位数。 解决方案很简单:

每次从SharedPreferences中检索字符串后,将所有换行符替换为\n

String fixedString = problemString.replace(System.getProperty("line.separator"),"\\\n" );

如果你的字符串包含手动格式化的字符串,其中包含除\n以外的换行符,你应该使用它:

String fixedString = problemString.replace("\r\n|\n|\r", "\\\n");

<强>更新

如果您的字符串已经使用unix EOL字符格式化,上述解决方案将导致问题,如果您有多个使用不同EOL字符格式化的字符串,则无法使用。因此,我发现的最佳方法是只更换\r

表示的回车符
String fixedString = brokenString.replace("\r", "");

此方法将删除字符串中的所有回车符,因此字符串将从(Windows CR LF)格式转换为(Unix LF)格式。每个换行符的长度将减少1位数。 :)