【发布时间】:2011-03-03 21:02:24
【问题描述】:
在阅读了一本介绍性的 Android 编程书籍之后,我想修改示例应用程序,以巩固我对一些没有真正涉及的主题的理解。在进行更改时,我犯了一个错误,但我很好奇为什么该错误在某些情况下有效,而在其他情况下无效。
应用程序中的一个活动将一系列问题存储在 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() 将 Hashtable 保存到 Bundle 中。" -- 不要将你的数据模型置于实例状态。将您的数据模型放入文件或数据库中。这就是您“防止冗余下载”的方式。 “当我按下模拟器的 Home 键和应用程序无声无息地崩溃时才知道有问题,没有 LogCat 输出。” ——而你对这种无声的、无形的崩溃的证明是……究竟是什么?
-
@CommonsWare:Eclipse 中出现一个弹出窗口,要求打开 Debug 透视图,因为启动已暂停。这就是我知道它崩溃的原因。我已经注释掉了使问题可打包的代码,并且在一次尝试中(在几次尝试中),它确实强制关闭并记录了错误,但在发布此问题之前并没有发生这种情况。
-
是的,数据确实应该保存到文件中,但这不是我想要做的。我不是在生产应用程序中工作(即使是个人爱好)。我正在修改通过Sam's Teach Yourself Android Application Development in 24 Hours 一书创建的演示应用程序。即使是一本介绍性的书,它似乎也遗漏了一些非常基本的主题。我想看看 onSaveInstanceState() 是如何工作的。我想我现在已经掌握了它的机制,如果不是什么时候以及如何最好地使用它。
-
如果 Eclipse 拦截到异常,您将不会在 LogCat 中看到堆栈跟踪。让 Eclipse 运行超过异常点,堆栈跟踪应显示在 LogCat 中。
-
我在序列化 onSaveInstanceState() 中的链表对象时遇到了类似的问题。当我旋转屏幕方向时,对象被序列化和反序列化没有问题。当我点击主页按钮时,应用程序在 onSaveInstanceState 中崩溃,LogCat 报告堆栈溢出错误。有人知道为什么这两种情况会产生不同的结果吗?
标签: android android-activity bundle parcelable activity-lifecycle