对象变为空

时间:2013-10-09 13:53:11

标签: java android performance garbage-collection

您好我们在Android应用程序中面临一个奇怪的问题。在我们的应用程序中,当我们启动应用程序(第一个活动)时,我们将所有需要的对象/数据存储在Common对象(称为对象A)中。我们将上下文本身存储在该对象中。每当我们在应用程序中需要上下文时,我们就会从对象A获取上下文并使用它。除下列情况外,所有案件均可正常工作。

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

两种情况,对象A都变为空(可能被GC删除),因此所有依赖于对象A的操作都会获得异常。

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

2 个答案:

答案 0 :(得分:7)

  

为什么会这样?

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

  

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

别。找到解决问题的不同方法。

  

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

最后,决定取决于您,但这里有一些常见选项:

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

第二个选项显然不适用于您的Context,但我可能会为Context构建一个不同的解决方案。

答案 1 :(得分:2)

您最好使用应用程序上下文! 只需在getApplicationContext()中使用Activity即可。 否则,只要系统需要内存,您的活动就会泄漏。

按下主页时,您的活动会在后台进行, 当然后播放视频游戏或消耗内存的应用程序时,系统会释放您的活动。

尝试了解活动生命周期以解决此问题:

enter image description here

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

我希望这对你有所帮助。