我可以对Android中的OutOfMemory Exception做些什么?

时间:2013-08-06 12:40:27

标签: image exception garbage-collection out-of-memory

我是Android编程的新手。 我在布局中使用了大量图像(还有声音)。 最近我通常有OutOfMemory异常,现在我完全卡住了。我该怎样预防呢? 我是否应该取消对未使用的布局项的引用并让GC工作?或者我应该回收图像资源吗?

关于我的申请: 这将是一个游戏,你可以在下面看到一些关于它的提议截图。 基本上有一个Activity,我想在同一个活动中放置大约9-10个膨胀的布局。我想把这些布局放到同一个Activity中的主要原因是,它们在逻辑上是一致的,我想在它们之间迅速切换。

然而,这些布局视图会消耗大量内存资源(例如,由于图片和声音),并且内存中充满了它们。不幸的是,由于某些原因,GC没有帮助,尽管我试图取消布局视图的引用。

enter image description here

2 个答案:

答案 0 :(得分:1)

我们会使用更多信息来真正帮助您。 OutOfMemoryException是非常不公正的,你的程序是什么? 但看看这些:

- 你可能想要看一些无限循环/条件

- 音频和视觉资源可能相当大,请务必使用压缩格式。

- 启动程序时不要加载整个资源

- 您可以使用函数在GC执行之前释放内存,但同样,这是不公正的,具体取决于您的应用程序

请提供有关您申请的更多信息

答案 1 :(得分:1)

如果我们不了解您的应用程序的设计,这是一个非常广泛的问题。最有可能的是,您的应用程序有内存泄漏,或者它只是设计需要大量内存

如果你确实有内存泄漏,你应该尝试找到并关闭它们。这通常通过确保您的引用不会转移到不需要它们的地方来完成。尽可能使范围尽可能严格。明确地设置对null的引用很少是一个好主意,因为它通常适用于两种情况:一种情况是你谈论自动(本地)变量,所以将它们设置为null并不会使你的应用程序受益(它们'当它们超出范围时,将被自动忽略为引用)。另一种情况是,如果这些引用是对象中的字段,在这种情况下将它们设置为null可能会使对象处于无效状态(取决于大小写),因此将状态有效性检查委派给代码中使用这些对象的每个位置,使整个代码变得混乱。现在,要明确:我不是说设置对null的引用无济于事,我说如果你必须这样做,你可能会保留你不应该提到的引用'保持,所以你有一些设计缺陷,而不是缺乏空的任务。

另一方面,如果你的应用程序实际上需要大量内存(假设它没有内存泄漏),那么你应该重新设计一些功能以消耗更保守的数量。例如,在内存中加载只需要真正需要的东西。考虑使用更紧凑的格式。如果您正在缓存内容但不希望缓存机制使其保持活动状态,请考虑使用弱引用