没有名称属性的Map值:string

时间:2014-03-19 17:59:58

标签: android exception sharedpreferences

我在我的应用中使用了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. 如果我的设备有问题,我应该怎么做才能纠正它?

1 个答案:

答案 0 :(得分:2)

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

我正在从列表中删除项目并维护共享首选项中列表项的状态。我有切换案例,默认情况下我将键值设置为null。因为我的for循环逻辑错了,我发现如果我删除任何项目肯定会进入默认情况。

    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循环逻辑并删除了默认情况,以确保在共享首选项中没有使用null键,并且如果我的for循环逻辑仍然错误则获取异常。现在工作正常。

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

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