1

在我的应用程序中,我使用getPreferences(MODE_PRIVATE)with putString()putBoolean()等来保存应用程序状态。数据量不是很大——可能有几个字符串和几个布尔值。保存数据时我从来没有遇到任何错误,但是当我阅读它时,有时我会遇到 XML 错误。例如,我正在尝试使用以下代码读取值:

String cr = getPreferences(MODE_PRIVATE).getString("user-input-" + block.getID(), "");

有时这工作得很好,而在其他情况下它会产生这个错误:

03-22 12:42:25.846: W/ApplicationContext(406): getSharedPreferences
03-22 12:42:25.846: W/ApplicationContext(406): org.xmlpull.v1.XmlPullParserException: Error parsing document. (position:line -1, column -1) caused by: org.apache.harmony.xml.ExpatParser$ParseException: At line 3, column 29: not well-formed (invalid token)
03-22 12:42:25.846: W/ApplicationContext(406):  at org.apache.harmony.xml.ExpatPullParser$ByteDocument.flush(ExpatPullParser.java:959)
03-22 12:42:25.846: W/ApplicationContext(406):  at org.apache.harmony.xml.ExpatPullParser$Document.pump(ExpatPullParser.java:770)
03-22 12:42:25.846: W/ApplicationContext(406):  at org.apache.harmony.xml.ExpatPullParser$Document.dequeue(ExpatPullParser.java:814)
03-22 12:42:25.846: W/ApplicationContext(406):  at org.apache.harmony.xml.ExpatPullParser.next(ExpatPullParser.java:303)
03-22 12:42:25.846: W/ApplicationContext(406):  at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:674)
03-22 12:42:25.846: W/ApplicationContext(406):  at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:469)
03-22 12:42:25.846: W/ApplicationContext(406):  at android.app.ApplicationContext.getSharedPreferences(ApplicationContext.java:340)
03-22 12:42:25.846: W/ApplicationContext(406):  at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
03-22 12:42:25.846: W/ApplicationContext(406):  at android.app.Activity.getPreferences(Activity.java:3444)
03-22 12:42:25.846: W/ApplicationContext(406):  at com.mypackage.BlockActivity$SetupTask.doInBackground(BlockActivity.java:79)
03-22 12:42:25.846: W/ApplicationContext(406):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
03-22 12:42:25.846: W/ApplicationContext(406):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-22 12:42:25.846: W/ApplicationContext(406):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-22 12:42:25.846: W/ApplicationContext(406):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-22 12:42:25.846: W/ApplicationContext(406):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-22 12:42:25.846: W/ApplicationContext(406):  at java.lang.Thread.run(Thread.java:1096)

我的代码中的第 79 行就是上面显示的那一行。关于发生了什么以及如何解决这个问题的任何想法?非常感谢。

4

2 回答 2

1

在为此苦苦挣扎了一段时间后,在模拟器(不同版本)和两个不同的手机上都出现了这个错误,我放弃了将数据保存到共享首选项中。我仍然将布尔值和整数值保留在共享首选项中,但将字符串数据保存到文件中。这每次都有效,永远不会给我带来任何问题。

需要注意的一点是,有些字符串可能很长,可能有几千个字符。也许它与这个问题有关。

于 2012-06-21T08:13:22.783 回答
-1

将设备恢复出厂设置后重试。我有一个类似的问题,这对我有用

于 2012-06-21T01:14:33.013 回答