为什么要在onPause() - onResume()而不是onStop() - onStart()中提交/读取Android数据?

时间:2013-02-21 17:30:44

标签: android android-activity

文档建议应在onPause() / onResume()中提交/阅读数据。

然而,当应用程序不再处于前台时,其数据结构保持不变,这表明可以延迟提交/读取数据,直到应用程序不再可见,即在onStop() / {{1} }。特别是因为保证在onStart()之前调用onStop()

这两种方法都适合吗?文档在这里只是一个指导原则吗?

更新 假设您的应用程序需要保存相对较多的数据,比如对大图像进行编辑。然后肯定会在onDestroy() / onPause()写/读,以免用户体验变得迟钝。在这种情况下,应该选择在onResume() / onStop()中写入/读取。这是真的吗?

3 个答案:

答案 0 :(得分:4)

使用onStop的问题在于,您无法保证何时调用它,因为唯一确定的是它将在onDestroy之前调用。如果您等到onStop提交数据,则可能会延迟其他活动显示/使用任何这些更改。同样的事情适用于onStart,如果它只是在后台,您的活动可能不需要重新启动,因此您将拥有过时的数据。使用onResumeonPause可确保您的数据始终是最新的,只要活动进入后台就会进行提交,并且一旦新数据变为可见,就会立即加载新数据。

答案 1 :(得分:3)

是的,它只是一个指南(通常是一个很好的指南)。当您想要提交更改时,完全取决于您。我个人喜欢创建允许简化数据库或SharedPreferences的Store Objects,并且在进行更改时,我会立即提交这些更改。对于简单的数据存储,这对用户来说是快速且不可见的。对于大型数据集,这可能需要更多时间,您可能希望在时间间隔和onPause中进行这些写入。

至于何时阅读 - 你可以随时阅读,但是更长的阅读时间往往会影响用户体验,除非你在另一个线程中处理它,例如使用AsyncTask。

要进一步回答您的更新: 这取决于开发人员,但我会在onPause()编写,如果需要,可以在单独的线程中读取,可能使用onResume()进行初始化。我也可以使用Timer线程在预定的时间间隔内写出数据,具体取决于它将如何影响当前会话的用户体验,以及如果手机关闭并丢失所有数据将是灾难性的onPause()被称为。{/ p>

答案 2 :(得分:0)

对此的真正答案是,onPause是唯一可以保证在Android 破坏您的流程之前调用的方法。如果用户离开您的应用程序接听电话,并且Android决定关闭您的流程,则完全合法,只能获得onPause电话。如果您没有在那里保存状态,当用户点击后退按钮时,您将最终以与用户不同的状态重新创建您的活动。