【问题标题】:Android Notepadv3 tutorial - Is saveState() in onSaveInstanceState really necessary?Android Notepadv3 教程 - onSaveInstanceState 中的 saveState() 真的有必要吗?
【发布时间】:2010-09-08 20:39:14
【问题描述】:

我只是一个Android初学者,但是在记事本第三篇教程中我注意到了一些看起来有点奇怪的东西:

  • 本教程明确指出您需要从 onSaveInstanceState 和 onPause 中调用 saveState。这真的有必要吗?在我看来,从阅读进程生命周期文档来看,onPause 总是会在 Activity 被杀死之前被调用,无论它是由系统还是用户执行的。如果是这种情况,肯定只从 onPause 调用 saveState 就足够了吗?
  • 在 onResume 和 onCreate 中调用 populateFields() 是没有意义的,因为 onResume 总是在 onCreate 之后调用。因此,如果我理解正确,onCreate 中的调用没有任何用处,可以安全地删除。

有人可以确认这些点,或者让我知道我误解了什么。

奥利

【问题讨论】:

  • 另外,这个例子中的 onResume 方法不是完全没有意义吗?根据生命周期文档,暂停的 Activity 会保留其所有状态,那么在取消暂停时重新填充字段有什么意义(因为它们不能在其他地方更改)?
  • 一个非常常见的模式是呈现一个列表视图,当单击一行时,会打开一个新活动以允许编辑单击的项目。发生这种情况时,您需要在 onResume 期间刷新数据,以便列表视图反映这些更改。乍一看,看起来他们实际上是从数据库中检索可能已修改的数据。他们更有可能不需要在 onCreate 中调用 populateFields(),但他们确实需要将其保留在 onresume 中。
  • 在 onCreate 中而不是在 onResume 中调用 populateFields() 还不够吗?没有任何情况(据我所知)当这个 Activity 暂停时底层数据可以改变,因此每次取消暂停时都不需要加载它?
  • 是的,如果您认为在此活动暂停期间不会更改数据是正确的,那么 onCreate 应该就足够了。

标签: java android notepad


【解决方案1】:

据我了解...

你是正确的,onResume 总是在 onCreate 之后被调用,你通常可以把代码放在那里。请记住,当活动回到前台时也会调用 onResume,而无需先通过 onCreate。因此,对于一次性初始化代码(如 setContentView() 或初始化变量)而言,onCreate 事件是一个更好的地方。

此外,您对 onPause 和 onStop 的看法是正确的。 onPause 是您通常编写状态处理代码的地方。 onPause 是可终止的,因此 onStop 在内存非常低的情况下甚至可能不会被调用。

【讨论】:

  • 糟糕,我刚刚注意到您指的是 onSaveInstanceState 而不是 onStop(不知道我是如何偏离轨道的,抱歉)。他们的例子是正确的。虽然 savestate 有时会被调用两次,但他们需要在 onSaveInstanceState 中调用它以获取要添加到包中的新数据的 ID,并在 onPause(在未调用 onSaveInstanceState 的情况下)中调用它以确保数据是至少得救了。
  • 啊 - 在这里忽略我以前的帖子..废话:)。谢谢。
  • 由 onSaveInstanceState 调用的 saveState 会修改 mRowId,然后在 onSaveInstanceState 中的下一行将其放入包中。虽然该 rowid 在技术上是持久的,因为它在数据库中,但他们在那里使用它的方式,它不是。他们在那里使用它来知道正在显示哪个注释。然而,这就是为什么他们也会在 onPause 事件中调用 saveState。此时,他们并不关心显示的是哪个 ID,而是关心数据已保存且不会丢失。由于 onSaveInstanceState 可能不会被调用,他们也必须从 onPause 调用它。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 2021-01-25
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
相关资源
最近更新 更多