5

嗨,我们在我们的 android 应用程序中遇到了一个奇怪的问题。在我们的应用程序中,当我们启动应用程序(第一个活动)时,我们将所有需要的对象/数据存储在一个公共对象(称为对象 A)中。我们将上下文本身存储在该对象中。每当我们在应用程序中需要上下文时,我们都会从对象 A 获取上下文并使用它。除以下情况外,所有情况都可以正常工作。

i) 当我们的应用程序在后台运行时,我们玩了一些高端游戏。现在我们通过最小化屏幕(最近的应用程序)回到应用程序。突然应用程序崩溃了。
ii)如果我们通过设置强制停止应用程序,并通过最小化屏幕返回应用程序,则会发生相同的崩溃。

在这两种情况下,对象 A 都变为 null(它可能会被 GC 删除),因此所有依赖于对象 A 的操作都会出现异常。

为什么会这样?我们如何防止GC收集对象A?我们如何处理强制停止?请给出任何想法。

4

2 回答 2

7

为什么会这样?

其他应用程序也需要内存才能运行。假设 Android 会将您的数据无限期地保存在内存中是不合理的。

我们如何防止GC收集对象A?

不。为您的问题找到不同的解决方案。

我们如何处理强制停止?请给出任何想法。

最后,决定权在你,但这里有一些常见的选择:

  • 当存储的数据不再存在时,将其视为应用程序的全新启动。将用户带到登录页面并让他开始新游戏。
  • 坚持数据。根据您存储的内容,SharedPreferences 或 SQLite 可能是不错的选择。有关存储选项的摘要,请参阅存储选项。

第二个选项显然不适用于您的上下文,但无论如何我可能会为上下文构建一个不同的解决方案。

于 2013-10-09T13:58:06.363 回答
2

您最好为此使用应用程序上下文!只需getApplicationContext()在你的Activity和使用它来代替。否则,一旦系统需要内存,您的活动就会泄漏。

当你按下 home 键时,你的 Activity 会进入后台,然后在玩视频游戏或消耗内存的应用程序时,你的 Activity 会被系统释放。

尝试了解活动生命周期来解决这个问题:

在此处输入图像描述

GC此外,当在“普通”java 中看到它时,活动的 Wrapped 对象一旦符合条件就会被收集,即它不再被任何其他对象引用。如果您的整个应用程序在系统需要内存时被释放,这是无法避免的。尝试检查 nullonResume()并再次重新实例化您的对象!

我希望这可以帮助你。

于 2013-10-09T14:48:24.557 回答