我是否需要恢复onResume上的所有变量?

时间:2011-11-05 21:34:14

标签: android variables

我对static class variables有不好的经验,因为当课程卸载时它们的值会丢失。因此,我完全避免它们。

现在我(可能过度)担心“正常”变量。

  

我不确定他们的价值是否也会在某些情况下丢失   通过电话中断,内存不足或其他任何情况。

我可以依靠变量保持其值100%?

我是否确保对所有活动变量进行某种有效的恢复?

谢谢!

3 个答案:

答案 0 :(得分:20)

  

我对静态类变量有不好的经验,因为当类卸载时它们的值会丢失。

类不会“卸载”。 {$ 3}}在Android无需占用任何内容之后的某个时间,当Android需要回收内存时。

  

我可以依靠变量保持其值100%吗?或者我是否确保对所有活动变量进行某种有效的恢复?

通过致电onPause(),活动会被通知他们何时被移出前台。从该活动的角度来看,在onPause()之后的任何时间直到(可能)相应的onResume(),该过程可能会终止并且活动将丢失。

您需要坐下来思考您的数据模型。假设用户离开您的应用程序(例如,按HOME)并且不会在一小时,一天或一个月内返回您的应用程序。用户合理期望在该段时间内保留的任何数据都需要保存在持久性数据存储中,例如数据库或平面文件。您的工作是确定何时保存数据 - 可能是用户按下“保存”按钮,或者可能是在活动的onPause()中,或者可能是在某个其他时间。

可以通过onSaveInstanceState()保留与屏幕当前内容相关联但不需要保存一个月的数据。希望您已经使用它来处理屏幕旋转。如果是这样,并且如果用户离开您的活动,但是他们可以通过BACK按钮导航回到它(例如,来电话,然后是文本消息,然后他们点击一个链接文本消息并调出Web浏览器,稍后返回到您的应用程序(已在此期间终止),您的已保存实例状态将被恢复。

如果用户离开应用程序,如果Android选择终止您的进程,则其他所有内容 - 活动的实例数据成员或静态数据成员或其他任何内容可能会丢失。因此,静态数据成员通常仅用于短期缓存或用于在用户按下HOME或接听电话或其他任何内容时丢失的内容。

答案 1 :(得分:2)

如果您的活动中有需要保存的数据,请实施onSaveInstanceState。

http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle

在你的onCreate中,如果传入的包不是null,你可以假设你已经保存了一些状态,并从中恢复。

答案 2 :(得分:1)

正常变量仍然存在,但问题是你永远无法确定你何时重新开始以及当你正在进行创造时(因为你无法控制Android何时进入并将堆栈上的内容扔掉)窗口......当前未使用的任何东西都有资格销毁。

所以...你最好的选择是以任何有意义的方式保存物品,如果你真的需要它们之间有人可能逻辑地让设备进入睡眠状态,或者旋转它,或者打个电话,或者其他什么打断它的TOP(ness)。

我不太喜欢捆绑包的工作方式,所以,我一直把我的东西存放在JSONobject中,我将其转换为字符串并保存为一个平面SharedPreference字符串(注意SP仍然存在永远,而一旦你的应用程序被GCed,你的Bundle将与其他一切一起抛出)。这样我就可以随时随地抓住它,而不是不得不使用十亿种不同的Bundle元素,但这显然是一种品味问题。前面有更多的工作,当然序列化/反序列化的开销稍微多一点,但由于它只发生在我的变量被破坏的罕见情况上,所以它真的不是任何需要担心的事情(除非你有大量的数据,在这种情况下你应该使用数据库)。