2014-03-19 102 views
0

我在我的应用中使用了sharedpreference,问题是当我强制关闭或从最近的应用程序中删除应用程序并再次打开它时,它给了我例外说Map Value without name attribute和优先值被重置。没有名称属性的字符串值:字符串

我通过stackoverflow找到了这个问题,我发现了一些类似的问题,如thisthis

下面这些问题后,我试图重现模拟器中的问题,但它没有给我任何例外或重置首选项XML。我通过DDMS从模拟器数据文件夹中提取了xml文件,所有内容都看起来不错。每个值都有一个非空的键名称。在真机上运行时

logcat的例外:所以在这里

03-17 14:59:55.099: W/SharedPreferencesImpl(8636): getSharedPreferences 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:568) 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:821) 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:755) 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:494) 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:113) 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at android.app.SharedPreferencesImpl.access$000(SharedPreferencesImpl.java:48) 
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:87) 

是我要问:

  1. 有没有在移动设备代码或问题的任何问题?

    shared = getSharedPreferences(PreferenceHandler.PREFS,Context.MODE_PRIVATE); 
    Log.i(TAG,"preference object created"); 
    last = shared.getInt(PreferenceHandler.LASTACTIVITY,PreferenceHandler.DEFAULTINT); 
    
  2. 如果问题出在我的设备上,我应该怎么做来纠正它?

+0

你是否每次提交()'更改?或者至少在你的'onPause()'中。 – Simon

+0

是的。我在将值添加到sharedPreference的方法结束时提交它。同样的代码也在模拟器中工作。强制关闭之前,我检查模拟器的偏好xml文件并存储了该值。还有,承诺是否真的导致了这个问题?如果没有存储键值对,它将返回默认值,但在我的情况下,它是说,名称属性为空,我在日志中检查,并不是空。 – user2376920

+0

你是对的,我只是想知道是否会有一些缓存导致一个损坏的文件,但如果你已经检查过XML,事实并非如此。这很奇怪。如果你找到答案,请回来张贴。 – Simon

回答

2

我正在为那些有类似问题的人回答我自己的问题。

我从列表中删除项目并在sharedpreference中维护列表项的状态。我有切换案例,其中有默认情况下,我将键值设置为null。因为我的循环逻辑是错误的,我发现它一定会进入默认情况下,如果我删除任何项目。

switch (i + 1) { 

    case 0: 
     pref_1 = PreferenceHandler.constantA1; 
     pref_2 = PreferenceHandler.constantB1; 
     pref_3 = PreferenceHandler.constantC1; 
     break; 

    case 1: 
     pref_1 = PreferenceHandler.constantA2; 
     pref_2 = PreferenceHandler.constantB2; 
     pref_3 = PreferenceHandler.constantC2; 
     break; 


    case default: 
     pref_1 =null; 
     pref_2 = null; 
     pref_3 = null; 
     break; 

一旦调试我的for循环逻辑并删除默认的情况下,以确保在sharedpreference使用无空密钥,并获得异常,如果我的for循环的逻辑仍然是错误的。现在它工作正常。

因此,如果有人得到相似类型的异常,并且无法找出它使用null键的位置,请尝试找出它在引发异常之后是什么步骤,然后检查它。

我希望它能帮助某人! :)

+0

在理解发生了什么之前,我需要阅读http://toastdroid.com/2014/07/04/null-shared-preference-key-bad-news-droids/。 – CodeReaper