我的应用程序的一些用户抱怨有时(以随机方式)我的应用程序的设置被恢复到其默认状态(通常在重新启动手机后).我从来没有设法重现这个问题.我认为这是因为在我的应用程序的许多地方我有一段代码调用共享首选项编辑器并提交更改 - 如果我尝试提交多个更改,它是否可以解决共享首选项文件的问题相同的偏好文件同时?(多线程应用程序)
我真的迷路了.我试着在网上找了几个小时才找到一个没有成功的解决方案.
如果有人有一个想法,所以我可以开始调查,我将不胜感激.
谢谢,阿米特莫兰
我试图弄清楚当我尝试获取应用程序的共享首选项时,它在启动时发生此错误的原因.代码只是:
settings = this.getSharedPreferences(Globals.PREFS_NAME,0)
看起来像一个腐败,但错误是在应用程序中,因为我已将其安装在多个设备上,并发生相同的错误.我卸载了应用程序并重新安装它无济于事.还做了一个完全干净的构建.我用Google搜索错误,似乎无法找到任何内容.
我以前工作得很好.所以我很难过.任何线索都会非常感激......
问候,
W/ApplicationContext( 1541): getSharedPreferences
W/ApplicationContext( 1541): org.xmlpull.v1.XmlPullParserException: Map value without name attribute: boolean
W/ApplicationContext( 1541): at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:521)
W/ApplicationContext( 1541): at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:733)
W/ApplicationContext( 1541): at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:667)
W/ApplicationContext( 1541): at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:470)
W/ApplicationContext( 1541): at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:376)
W/ApplicationContext( 1541): at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
W/ApplicationContext( 1541): at net.robmunro.mypod.WelcomeActivity.onEWCreate(WelcomeActivity.java:160)
W/ApplicationContext( 1541): at net.robmunro.mypod.AbstractEWActivity.onCreate(AbstractEWActivity.java:25)
W/ApplicationContext( 1541): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
W/ApplicationContext( 1541): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
W/ApplicationContext( 1541): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
W/ApplicationContext( 1541): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
W/ApplicationContext( 1541): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
W/ApplicationContext( 1541): at android.os.Handler.dispatchMessage(Handler.java:99)
W/ApplicationContext( 1541): …Run Code Online (Sandbox Code Playgroud) 在Android中,我想编写SharedPreferences键值为Base64字符串的键值对.
// get a SharedPreferences instance
SharedPreferences prefs = getSharedPreferences("some-name", Context.MODE_PRIVATE);
// generate the base64 key
String someKey = new String(Base64.encode("some-key".getBytes("UTF-8"), Base64.URL_SAFE), "UTF-8");
// write the value for the generated key
prefs.edit().putBoolean(someKey, true).commit();
Run Code Online (Sandbox Code Playgroud)
在最后一行中,对commit的调用返回true.所以这个键值对应该已经成功保存.
当我关闭并销毁使用Activity此代码的位置然后重新创建Activity(再次运行此代码)时,将为我们使用的密钥返回指定的值.
但事实证明,当我销毁整个应用程序/进程时(例如在应用程序设置中使用"强制停止"),我们的密钥值将在下次启动时丢失Activity.
当我不使用Base64.URL_SAFE但Base64.URL_SAFE | Base64.NO_WRAP作为Base64编码的标志时,它工作正常.
所以这个问题是由Base64键末尾的换行引起的.像这样的键abc可以毫无问题地编写.但是当关键是abc\n,它失败了.
问题是,它似乎没有问题,工作第一,返回true上commit()并返回后续调用正确的优先级.但是当整个应用程序被销毁并重新启动时,该值并未持久存在.
这是预期的行为吗?一个bug?文档是否说明了有效的密钥名称?