Giả sử tôi có một đối tượng Java Bean có thể tuần tự hóa. Tôi muốn lưu trữ nó một cách an toàn khi Hoạt động đi qua onDestroy() với mục đích (ví dụ: onSaveInstanceState() là không phải là được gọi).Làm cách nào để giữ lại một đối tượng phức tạp trong Hoạt động khởi động lại?
Tôi đang tìm một cách không liên quan đến việc tạo cơ sở dữ liệu và viết đối tượng đó (chủ yếu là do a) API DB của Android là khủng khiếp và b) vì cơ sở dữ liệu cập nhật ứng dụng một cơn ác mộng, vì không có hỗ trợ cho việc áp dụng di chuyển).
Tôi đã nghĩ về việc sắp xếp từng đối tượng thành một ByteArrayOutputStream, mã hóa base64 và ghi nó vào một tệp SharedPreferences dưới dạng một chuỗi. Hay là quá xa?
CẬP NHẬT
Có lẽ đó là ý tưởng serialize-to-string là không phải là xấu sau khi tất cả, dường như làm việc ra khá tốt. Đây là những gì tôi đang làm bây giờ:
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;
}
trong onDestroy() Tôi có thể sau đó chỉ cần viết chuỗi Base64 vào một tập tin sở thích, nơi đó là an toàn cho đến khi tôi đọc nó một lần nữa trong sự ra mắt hoạt động tiếp theo. Đó là nhanh hơn rất nhiều so với tôi mong đợi và trừ khi đậu của bạn mang theo một lượng lớn dữ liệu, nó hoạt động khá tốt. Và thậm chí tốt hơn, bạn không phải duy trì một lược đồ DB.
Tuy nhiên, tôi rất tò mò về cách người khác làm điều này.
Bạn không thể chỉ sử dụng Gói thay thế? – JRL
như thế nào? bạn chỉ có thể truy cập gói nếu hoạt động của bạn đi qua onSaveInstanceState(), tức là khi hoạt động đó bị thời gian chạy hủy. – Matthias
Tuyệt vời! Tôi đã sử dụng cách tiếp cận của bạn và nó hoạt động. Chỉ có vấn đề tôi đã có là Base64InputStream trong Android SDK không có một hàm tạo có một tham số bây giờ nó có một tham số cờ int bổ sung. Chỉ cần đặt giá trị đó thành 0 hoặc 8 nếu bạn có bất kỳ thông tin url nào trong Đối tượng. – JPM