Sau khi trải qua một cuốn sách lập trình Android giới thiệu, tôi muốn thay đổi ứng dụng ví dụ để củng cố sự hiểu biết của tôi về một số chủ đề không thực sự được đề cập đến. Trong khi thực hiện thay đổi, tôi đã mắc lỗi, nhưng tôi tò mò vì sao lỗi này hoạt động trong một số trường hợp nhưng không phải trong các trường hợp khác.Tại sao lưu một Hashtable của các đối tượng không phải Parcelable trong onSaveInstanceState() đôi khi làm việc?
Một hoạt động trong ứng dụng lưu trữ một loạt các câu hỏi trong một số Hashtable<Integer, Question>
, trong đó Câu hỏi là một lớp nhỏ chứa một chuỗi int và hai. Như được viết ban đầu, hoạt động tải các câu hỏi từ một máy chủ trên mỗi onCreate()
, vì vậy tôi muốn triển khai onSaveInstanceState()
để ngăn một số tải xuống thừa. onSaveInstanceState()
lưu Hashtable vào Gói bằng cách sử dụng putSerializable()
.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// mQuestions is a member variable of
// type Hashtable<Integer, Question>
if (mQuestions != null && mQuestions.size() > 0) {
outState.putSerializable(SAVED_QUESTIONS, mQuestions);
}
}
Nó hoạt động hoàn hảo cho những thay đổi định hướng màn hình ngay cả trước khi tôi biết Parcelable là gì hoặc cách triển khai. Tôi chỉ biết có một vấn đề khi tôi nhấn phím home giả lập và ứng dụng âm thầm, vô tình bị rơi mà không có đầu ra LogCat. Việc theo dõi ngăn xếp dẫn tôi để tìm kiếm Parcelable và làm cho câu hỏi thực hiện nó.
Câu hỏi của tôi không phải là những gì tôi đã làm sai. Câu hỏi đặt ra là: Khi lớp Question không thực hiện Parcelable, tại sao ứng dụng chỉ gặp sự cố khi nhấn Home và không thay đổi hướng màn hình?
"onSaveInstanceState() lưu hàm băm vào gói bằng cách sử dụng putSerializable()." - không đặt mô hình dữ liệu của bạn trong trạng thái ví dụ. Đặt mô hình dữ liệu của bạn vào một tệp hoặc một cơ sở dữ liệu. Đó là cách bạn "ngăn chặn tải xuống dư thừa". "Chỉ biết có một vấn đề khi tôi nhấn phím home giả lập và ứng dụng âm thầm, vô tình bị rơi mà không có đầu ra LogCat." - và bằng chứng của vụ tai nạn vô hình, im lặng này ... là gì, chính xác? – CommonsWare
@CommonsWare: Một cửa sổ popup xuất hiện trong Eclipse yêu cầu mở phối cảnh Debug vì khởi chạy đã bị treo. Đó là cách tôi biết nó bị rơi. Tôi đã nhận xét ra các mã để làm cho câu hỏi Parcelable, và trên một thử (trong số nhiều), nó đã buộc chặt chẽ với các lỗi đăng nhập, nhưng điều đó đã không xảy ra trước khi gửi câu hỏi này. – erichamion
Có, dữ liệu thực sự cần được lưu vào một tệp, nhưng đó không phải là những gì tôi đang cố gắng làm. Tôi không làm việc tại một ứng dụng sản xuất (ngay cả đối với cá nhân, sở thích sử dụng). Tôi đã sửa đổi ứng dụng demo được tạo ra thông qua cuốn sách Phát triển ứng dụng Android của chính mình trong cuốn sách 24 Hours_. Ngay cả đối với một cuốn sách giới thiệu, nó dường như để lại một số chủ đề rất cơ bản. Tôi muốn xem cách onSaveInstanceState() hoạt động. Tôi nghĩ rằng tôi có cơ chế của nó xuống ngay bây giờ, nếu không phải khi nào và làm thế nào tốt nhất để sử dụng nó. – erichamion