SharedPreferences.commit失败,出现java.io.IOException:设备上没有剩余空间

时间:2012-06-29 20:56:03

标签: android sharedpreferences

问题是我的内存不足,因此写入失败。我无法自信地处理它,因为异常被丢弃(见http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/app/ContextImpl.java#3169)。 .commit()调用将返回false,我可以使用它来处理写入错误,但我不知道失败是来自空间问题还是其他问题。

我如何知道提交失败的原因?

堆栈跟踪

06-29 20:01:17.507: WARN/ApplicationContext(19221): writeToFile: Got exception:
        java.io.IOException: No space left on device
        at org.apache.harmony.luni.platform.OSFileSystem.write(Native Method)
        at dalvik.system.BlockGuard$WrappedFileSystem.write(BlockGuard.java:171)
        at java.io.FileOutputStream.write(FileOutputStream.java:300)
        at com.android.internal.util.FastXmlSerializer.flushBytes(FastXmlSerializer.java:212)
        at com.android.internal.util.FastXmlSerializer.flush(FastXmlSerializer.java:233)
        at com.android.internal.util.FastXmlSerializer.endDocument(FastXmlSerializer.java:183)
        at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:185)
        at android.app.ContextImpl$SharedPreferencesImpl.writeToFile(ContextImpl.java:3191)
        at android.app.ContextImpl$SharedPreferencesImpl.access$800(ContextImpl.java:2756)
        at android.app.ContextImpl$SharedPreferencesImpl$1.run(ContextImpl.java:3106)
        at android.app.ContextImpl$SharedPreferencesImpl.enqueueDiskWrite(ContextImpl.java:3127)
        at android.app.ContextImpl$SharedPreferencesImpl.access$100(ContextImpl.java:2756)
        at android.app.ContextImpl$SharedPreferencesImpl$EditorImpl.commit(ContextImpl.java:3049)

2 个答案:

答案 0 :(得分:0)

如何在编写文件之前检查可用空间并计算是否有足够的空间来容纳文件?您可以在此处查看如何查看内存Check Internal and External memory

答案 1 :(得分:-1)

你可以发布你的代码吗?这也是模拟器上的真实设备吗? SharedPerferences实际上只是一个xml文件。您可以使用adb shell自己浏览它们并转到data / data / your.package.name / sharedpreferences

您是否尝试过释放设备上的内存?删除一些旧文件或增加VM大小。另外,在#IO2012中只是注意到使用apply()而不是commit()。除非你真的想要你的回报价值,否则大多数人都没有。