2012-08-06 28 views
1

通常我总是在Imageviews中使用Drawable资源,因为我没有手动释放它们。图像资源如何回收?

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

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

回答

0

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

A BitmapDrawable包装Bitmap并包含对Bitmap的引用。 Bitmap是特殊的,因为Android将所有Bitmaps的像素数据保存在单独的堆中,该堆与应用程序的其余部分分开管理。当Android垃圾收集器清理一个Bitmap对象时,它还清理位图堆中的像素数据。但是您可以通过Bitmap上的recycle()手动调用Bitmap无效并释放其像素数据,从而更快地实现。

Android为每个正在运行的应用程序分配一个固定大小的位图堆,并且您的应用程序可能会耗尽太多太多的Bitmaps。这就是为什么如果您的应用程序广泛使用位图,只要您知道不需要它们,就可以从循环位图中获益。

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

+0

然后,如果我理解正确有任何“魔法”。如果我在onCreateView之后手动创建一个位图并设置Imageview,我可以预期Android会以释放由图像资源创建的图像的相同方式释放它。 – lujop 2012-08-06 19:00:48

+1

只要您的Activity没有任何引用手动创建的位图(例如,在静态字段或其他东西),它将被垃圾回收器和所有剩余的View对象清理干净。如果您知道您不再需要位图,并且想要为其他位置释放位图堆,则recycle()方法很有用。 – mportuesisf 2012-08-06 19:04:58

+0

这是虽然蜂窝前,因为蜂窝的位图内存与应用程序的其余部分在同一堆。 – Ixx 2012-08-06 19:09:22