我現在拿出我自己解決這個問題,這就是節能捆綁SharedPreferences的半自動方式。我說半自動化,因爲儘管保存Bundle只需要一種方法,但是再次檢索數據並將其重新轉換爲Bundle需要一些工作。
這裏是保存捆綁代碼:
SharedPreferences save = getSharedPreferences(SAVE, MODE_PRIVATE);
Editor ed = save.edit();
saveBundle(ed, "", gameState);
/**
* Manually save a Bundle object to SharedPreferences.
* @param ed
* @param header
* @param gameState
*/
private void saveBundle(Editor ed, String header, Bundle gameState) {
Set<String> keySet = gameState.keySet();
Iterator<String> it = keySet.iterator();
while (it.hasNext()){
key = it.next();
o = gameState.get(key);
if (o == null){
ed.remove(header + key);
} else if (o instanceof Integer){
ed.putInt(header + key, (Integer) o);
} else if (o instanceof Long){
ed.putLong(header + key, (Long) o);
} else if (o instanceof Boolean){
ed.putBoolean(header + key, (Boolean) o);
} else if (o instanceof CharSequence){
ed.putString(header + key, ((CharSequence) o).toString());
} else if (o instanceof Bundle){
saveBundle(header + key, ((Bundle) o));
}
}
ed.commit();
}
注意,我只寫了情況,因爲我所需要的類型,但如果你有捆綁也包括其他類型的,這應該是很容易適應。
此方法將遞歸地保存存儲在給定Bundle內的其他Bundle對象。但是,它不適用於Parcelable對象,所以我必須改變我的Parcelable對象,以便將它們自己存儲到Bundle中。由於Parcel和Bundles非常相似,這並不難。不幸的是,我認爲Bundles可能比Parcels稍慢。
我然後寫構造在所有我以前Parcelable對象,使他們從存儲SharedPreferences數據重新捆綁自己。很容易就可以重建所需數據的密鑰。假設你有以下數據結構:
Bundle b {
KEY_X -> int x;
KEY_Y -> Bundle y {
KEY_Z -> int z;
}
}
這些將被保存到SharedPreferences如下:
KEY_X -> x
KEY_YKEY_Z -> z
它可能不是世界上最漂亮的方法,但它的工作原理,以及它的成本我比替代方案少得多的代碼,因爲現在我的onSaveInstanceState方法和我的onPause方法使用相同的技術。
來源
2012-12-03 21:42:47
Dan
要序列化只是尋找一個序列化類,它不應該很難找到。我在使用它時沒有注意到任何令人生厭的延遲 – mango
我能找到的唯一信息告訴我我需要實現Serializable - 但Bundle沒有實現這個接口。 – Dan
我建議圖書館https://github.com/iamironz/binaryprefs,它允許通過實現持久化接口(在JDK Externalizable接口) –