2

在我的 APP 中,Activity-A 触发了另一个 Activity-B。Activity-B 触发另一个 Activity-C。现在控件从 Activity-C 通过 Activity-B 返回到 Activity-A。Activity-A 使用位图图像在其 Canvas 中绘制为背景。

问题:

  1. 当我从 Activity-A 移动到 B 时,是否需要在 onPause() 方法中回收位图变量(例如 background.recycle())?

  2. 假设,我在 onPause() 方法中回收了位图变量。这是否是避免 OOM 错误的好方法(请记住,当图像返回到 Activity-A 时必须重新绘制)

4

2 回答 2

1

您是否收到 OOM 错误?如果不是(因为您的位图不大),那么就什么也不做……文档中谈到了回收方法:

这是一个高级调用,通常不需要调用,因为当没有更多对该位图的引用时,正常的 GC 进程将释放此内存。

因此,Android 2.x 和 Android 4.x 之间也存在主要区别。在 Android 4 中,位图内存不再在本地进行管理,而是作为普通 Java 堆的一部分,并且像每个引用一样工作:如果不再有引用,那么垃圾收集器将在将来的某个地方收集位图。

调用回收的正确点在哪里?当位图不再显示在屏幕上时,正确的点将是。所以 onPause 可能是一种可能性,但请记住,您必须在 onResume 中重新加载它(异步)。那么这种方法有什么问题呢?一旦通过调用 recycle() 将位图标记为不再需要,该位图就不再可用,但可能还没有被 GC 收集。因此,如果用户从 Activty A 跳转到 B 并且会快速返回,那么您可能在内存中拥有两次相同的位图,因为 GC 尚未收集到第一个(回收的)位图。

所以我的提示是:如果您有内存问题,请尝试减小位图大小。使用质量较低的位图(查看位图选项)。但我想你需要尝试不同的策略来找到最适合你的应用程序的策略。

于 2013-07-07T18:35:09.803 回答
0

每次您不需要位图时都会回收它。使用 if 方法至少可以避免在某些情况下强制关闭。

if (null != bmp){
 bmp.recycle();
}

我建议您不要在活动之间发送位图,而是通过使用意图来获取其文件名并将其传递给您的活动,这样您将避免在每个活动中重新绘制位图,这肯定会导致 OOM。

于 2013-07-07T18:23:50.253 回答