2014-03-19 175 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