如何清理位图资源

时间:2011-06-11 01:04:29

标签: android memory-management memory-leaks bitmap imageview

我想问几次之前被问过的这个问题。对不起,如果我正在重新尝试,但我不清楚这里最好的解决方案是什么。

问题是“如何在使用后清理ImageView位图资源,因此我们在内存中没有对它的引用?”。

以下是一个例子:

  1. 屏幕1重定向到屏幕2
  2. 屏幕2包含控件A(大型照片的预览)
  3. 控件A包含ImageView B
  4. 启动控件A时设置ImageView B
  5. 第一次一切正常。一旦控制A完成,我将从屏幕2重定向到屏幕1.此时,控制A或ImageView B或其使用的位图的所有引用都应该是死的。他们不是!!!

    我尝试了各种解决方案,包括bitmap.recycle(),将finalize()添加到Control A,System.gs()和variouse位置(如onStop()和onDestroy()以及其他所有内容中的归零控件)在屏幕2上,没有任何作用!

    问题是当我第二次再次访问屏幕时,从屏幕1到屏幕2(即再次创建照片预览)我出现内存异常。据我所知,前一个位图的引用没有被清除。

    在重定向回屏幕1之前如何杀死它?

    我注意到了一件事。如果我缩小照片的尺寸,比如裁剪或制作较小尺寸的图像,一切顺利,很少次......在我遇到同样的问题之前。所以基本上只需要更长的时间来填满。

    我非常感谢这里有一些解决方案,因为这很关键。

2 个答案:

答案 0 :(得分:2)

您可能有内存泄漏,此视频可能会帮助您找到问题Google I/O 2011: Memory management for Android Apps

注意:3.1之前的位图存储在VM堆内存中但​​存储在本机内存中,这会导致注意到泄漏时出现很多问题,有关详细信息,请参阅视频

答案 1 :(得分:0)

了解WeakReference的使用方式。