說我有一個可序列化的Java Bean對象。我想在活動通過onDestroy()的目的(即onSaveInstanceState()是而不是調用)安全地存儲它。如何在Activity重新啓動時保留一個複雜的對象?
我正在尋找一種不涉及創建數據庫並寫入對象的方式(主要是因爲a)Android的數據庫API太糟糕了,而且b)由於數據庫使應用程序更新成爲一場噩夢,因爲沒有像樣的東西支持應用遷移)。
我想過將對象序列化爲ByteArrayOutputStream,base64將其編碼並將其作爲字符串寫入SharedPreferences文件。或者那太遙遠了?
UPDATE
也許這連載到字符串的想法並不壞畢竟,似乎工作得非常好。下面是我現在在做什麼:
public static String objectToString(Serializable object) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
new ObjectOutputStream(out).writeObject(object);
byte[] data = out.toByteArray();
out.close();
out = new ByteArrayOutputStream();
Base64OutputStream b64 = new Base64OutputStream(out);
b64.write(data);
b64.close();
out.close();
return new String(out.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static Object stringToObject(String encodedObject) {
try {
return new ObjectInputStream(new Base64InputStream(
new ByteArrayInputStream(encodedObject.getBytes()))).readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
中的onDestroy
()然後我可以簡單地寫中的Base64字符串中的首選項文件,其中,直到我的下一個活動期間推出看了一遍它是安全的。它比我預期的要快得多,除非你的豆子傳輸了大量的數據,它運行得非常好。更好的是,您不必維護數據庫模式。
不過,我很好奇別人如何做到這一點。
是沒可能只使用捆綁呢? – JRL 2009-10-28 13:55:54
怎麼樣?如果您的活動通過onSaveInstanceState(),即運行時將其銷燬,則只能訪問該包。 – Matthias 2009-10-28 14:12:27
太棒了!我用你的方法,它的工作原理。唯一的問題是Android SDK中的Base64InputStream沒有一個構造函數,它只有一個參數,現在它有一個額外的int標誌參數。只需將其設置爲0或8,如果您在對象中有任何url信息。 – JPM 2011-05-02 18:29:30