您好我们在Android应用程序中面临一个奇怪的问题。在我们的应用程序中,当我们启动应用程序(第一个活动)时,我们将所有需要的对象/数据存储在Common对象(称为对象A)中。我们将上下文本身存储在该对象中。每当我们在应用程序中需要上下文时,我们就会从对象A获取上下文并使用它。除下列情况外,所有案件均可正常工作。
i)虽然我们的应用程序处于后台,但我们玩了一些高端游戏。现在我们通过最小化屏幕(最近的应用程序)返回应用程序。突然,应用程序崩溃了。
ii)如果我们通过“设置”强制停止应用程序,并通过最小化屏幕返回应用程序,则会发生同样的崩溃。
两种情况,对象A都变为空(可能被GC删除),因此所有依赖于对象A的操作都会获得异常。
为什么会这样?我们如何阻止GC收集对象A?我们如何处理强制停止?请提出任何想法。
答案 0 :(得分:7)
为什么会这样?
其他应用也需要内存才能运行。假设Android将无限期地将您的数据保存在内存中是不合理的。
我们如何阻止GC收集对象A?
别。找到解决问题的不同方法。
我们如何处理强制停止?请提出任何想法。
最后,决定取决于您,但这里有一些常见选项:
第二个选项显然不适用于您的Context,但我可能会为Context构建一个不同的解决方案。
答案 1 :(得分:2)
您最好使用应用程序上下文!
只需在getApplicationContext()
中使用Activity
即可。
否则,只要系统需要内存,您的活动就会泄漏。
按下主页时,您的活动会在后台进行, 当然后播放视频游戏或消耗内存的应用程序时,系统会释放您的活动。
尝试了解活动生命周期以解决此问题:
此外,当在“普通”java中看到它时,活动的Wrapped对象一旦被合法就被GC
收集,即它不再被任何其他对象引用。如果在系统需要内存时整个应用程序被释放,则无法阻止这种情况。
尝试在onResume()
中检查null并再次重新实例化您的Object!
我希望这对你有所帮助。