2010-02-05 45 views
0

好像我必須做一些基本的非常錯誤的事情,但結果 很奇怪,而且我在追蹤問題時遇到了問題。當閱讀Android默認共享首選項時,出現遞歸ClassCastExceptions

這是我我活動的onCreate()

PreferenceManager.setDefaultValues(this, R.xml.metronome_preferences, false); 
mSharedPrefs=PreferenceManager.getDefaultSharedPreferences(this); 

下面的代碼家住在onStart()。

Map<String,?> map = mSharedPrefs.getAll(); 
boolean t = mSharedPrefs.contains("tempo_list_pref"); 
Log.d(logID, "t= " + t + " preferences=" + map.toString()); 
mBPMOption = mSharedPrefs.getLong("tempo_list_pref", 100); 

登錄貓正確地顯示:

十一月2日至五日:14:27.605:DEBUG /節拍器(16147):T =真 偏好= {graphics_list_pref = 1,conduct_list_pref = 12.0f, tempo_list_pref = 140,audio_list_pref = 2,meter_list_pref = 5}

mBPMOption很長。共享的prefs對象顯然是有效的,因爲我既可以檢索首選項作爲映射,也可以測試首選項的存在,但調用getLong()會導致ClassCastExceptions被遞歸拋出。至少,這是 我如何解釋我在調試器中看到的內容。錯誤對象 e包含e.cause,e.cause.cause,...。

我在模擬器和Google ION dev 手機中收到了同樣的錯誤。

任何想法,將不勝感激。

回答

0

它會幫助,如果你表現出的堆棧跟蹤,但...

private static final class SharedPreferencesImpl implements SharedPreferences { 
    ... 
    public long getLong(String key, long defValue) { 
     synchronized (this) { 
      Long v = (Long) mMap.get(key); 
      return v != null ? v : defValue; 
     } 
    } 

10便士說,你ClassCastException異常被拋出在那裏。當文檔說getLong會拋出ClassCastException不是一個Long時,它確實意味着它:一個int不會做。你確定你把這個存儲了很久嗎?將此行添加到您的代碼將告訴你你有什麼:

System.err.println(map.get("tempo_list_pref").getClass()); 
+0

很好的建議!事實證明,我的所有數字資源都以字符串形式存在於地圖中,這與我的解決方法一致。我只對地圖中的值使用適當的decode()或parseFloat()靜態方法。如果Android內部首選項映射僅包含字符串值,則在我看來Android代碼應爲: Long v = Long.decode((String)map.get(key)); – Mark 2010-02-06 10:25:25