在閱讀一本介紹性的Android編程書籍之後,我想修改示例應用程序,以便鞏固我對一些未真正涵蓋的主題的理解。在做出改變時,我犯了一個錯誤,但我很好奇爲什麼錯誤在某些情況下有效,但在其他情況下卻不起作用。爲什麼在onSaveInstanceState()中保存一個非可Parcelable對象的Hashtable有時會工作?
應用程序中的一項活動將一系列問題存儲在Hashtable<Integer, Question>
中,其中Question是一個持有int和兩個字符串的小類。如最初所寫,活動每onCreate()
下載服務器上的問題,所以我想實施onSaveInstanceState()
以防止某些冗餘下載。 onSaveInstanceState()
使用putSerializable()
將Hashtable保存在Bundle中。
@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);
}
}
即使在我知道Parcelable是什麼或者如何實現之前,它對屏幕方向的改變完美地工作。我只知道有一個問題,當我按下模擬器的主鍵和應用程序時,無聲無息地無視LogCat輸出而崩潰。堆棧跟蹤讓我查看Parcelable並讓Question實現它。
我的問題不是我做錯了什麼。問題是這樣的:當Question類沒有實現Parcelable時,爲什麼應用程序只按下Home而不是屏幕方向更改?
「的onSaveInstanceState()保存使用putSerializable()哈希表入捆綁」。 - 不要將數據模型置於實例狀態。將您的數據模型放入文件或數據庫中。這就是你「防止多餘的下載」。 「只有當我按下模擬器的主鍵和應用程序時才知道存在問題,無聲無息地崩潰,沒有LogCat輸出。」 - 而你對這種沉默無形的崩潰的證明是......究竟是什麼? – CommonsWare 2011-03-03 22:51:47
@CommonsWare:Eclipse中出現一個彈出窗口,要求打開Debug透視圖,因爲啓動已暫停。這就是我知道它墜毀的原因。我已經註釋出了問題可解釋的代碼,並且在一次嘗試中(幾次),它確實強制關閉記錄的錯誤,但是在發佈這個問題之前沒有發生。 – erichamion 2011-03-04 00:44:49
是的,數據真的應該保存到一個文件,但這不是我想要做的。我不是在製作應用程序(即使是個人,愛好使用)。我正在修改通過_Sam的24小時教你自己的Android應用程序開發創建的演示應用程序。即使是一本介紹性的書,它似乎也忽略了一些非常基本的主題。我想看看onSaveInstanceState()是如何工作的。我認爲我現在已經掌握了它的機制,如果不是,什麼時候以及如何最好地使用它。 – erichamion 2011-03-04 00:49:10