我们什么时候回收位图图像变量



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

问题:

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

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

您有OOM错误吗?如果没有(因为位图不大),那么就什么都不做。。。文档介绍了回收方法:

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

因此,Android2.x和Android4.x之间也有一个主要区别。在Android4中,位图内存不再是本地管理的,而是普通java堆的一部分,它的工作方式就像每个引用一样:如果不再有引用,那么垃圾收集器将在未来的某个地方收集位图。

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

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

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

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

我建议你不要在活动之间发送位图,而是使用intent获取其文件名,并像这样在活动中传递它,这样你就可以避免在每个活动中重新绘制位图,这肯定会导致OOM。

最新更新