如何回收图像资源?

时间:2012-08-06 18:42:06

标签: android android-imageview android-memory

通常情况下,我总是在Drawable中使用Imageviews资源,因为我无需手动释放它们。

但在某些情况下,我需要动态创建位图,然后在recycle()中手动调用onDestroy()。这是我根据that other StackOverflow question找到的最佳解决方案。

我想了解Android如何管理Drawable资源以及为什么我不必手动回收它们。当理解时,看看是否可以将类似的逻辑应用于手动创建的位图。

1 个答案:

答案 0 :(得分:0)

DrawableBitmap宽得多。 Drawable旨在表示图形系统可以呈现给显示器的任何内容。有Drawable的子类 - 例如ShapeDrawableColorDrawable - 不包含Bitmap,因此不需要任何类型的手动内存管理。

BitmapDrawable包裹Bitmap并包含对Bitmap的引用。 Bitmap是特殊的,因为Android会在单独的堆中维护所有Bitmaps的像素数据,该堆与应用程序的其余部分分开管理。当Android垃圾收集器清除Bitmap对象时,它还会清除位图堆中的像素数据。但是,您可以通过recycle()上的Bitmap手动调用Bitmap来强制它发生,这会标记Bitmap无效并释放其像素数据。

Android为每个正在运行的应用程序分配一个固定大小的位图堆,并且您的应用可能会通过一次使用太多{{1}}来耗尽其堆。这就是为什么如果您的应用程序广泛使用位图,一旦您知道不需要它们,您可能会从回收位图中受益。

更新:如评论中所述,单独的位图堆适用于预先Honeycomb版本的Android。从Honeycomb开始,位图堆与应用程序堆合并。这是一个SO post with more info