所以,自过去 24 小时以来,我一直在思考这个问题,在开始之前,让我澄清一下,这个问题仅发生在我的一部在 Marshmallow 上运行的 Android 手机上。
问题:
当我使用 StringRequest 检索字符串响应时,该字符串正是其应有的样子,然后我将其保存到 SharedPreferences,并且无论我从 SharedPreferences 检索文件多少次,该值都保持正确(即相同)。但是当我关闭应用程序并重新启动它,并从 SharedPreferences 检索字符串时,字符串会以某种方式发生变化,长度减少,与从服务器新获取的相同字符串相比,.equals 返回 false,所以我猜测 SharedPreferences 修改了字符串值在 Android Marshmallow 中独立存在。 经过大量调试后,我将两个字符串(从共享首选项以及服务器)写入单独的.txt文件到内部存储,并用 Notepad++ 打开它们,瞧!,控制字符从“CR LF”更改为'LF',从而导致字符串的长度发生改变,虽然长度不同,但当我在许多在线网站上比较这两个字符串时,他们都说“字符串完全相同!” :(
救救大家吧! 谢谢
最佳答案
经过一番折腾,终于找到了根本原因。
在某些设备上,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 位。 :)
关于java - 存储在 SharedPreferences 中的字符串在每次应用程序关闭时都会被修改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50387991/