通常我总是在Imageviews
中使用Drawable
资源,因为我没有手动释放它们。图像资源如何回收?
但在某些情况下,我需要动态创建位图,然后我必须在onDestroy()
上手动调用recycle()
。根据that other StackOverflow question,这是我找到的最佳解决方案。
我想了解Android如何管理Drawable
资源以及为什么我不需要手动回收它们。理解后,看看是否可以将类似的逻辑应用于手动创建的位图。
通常我总是在Imageviews
中使用Drawable
资源,因为我没有手动释放它们。图像资源如何回收?
但在某些情况下,我需要动态创建位图,然后我必须在onDestroy()
上手动调用recycle()
。根据that other StackOverflow question,这是我找到的最佳解决方案。
我想了解Android如何管理Drawable
资源以及为什么我不需要手动回收它们。理解后,看看是否可以将类似的逻辑应用于手动创建的位图。
A Drawable
比Bitmap
广泛得多。 Drawable
旨在表示图形系统可以呈现给显示器的任何内容。有Drawable
的子类 - 例如ShapeDrawable
或ColorDrawable
- 不包含Bitmap
,因此不需要任何手动内存管理。
A BitmapDrawable
包装Bitmap
并包含对Bitmap
的引用。 Bitmap
是特殊的,因为Android将所有Bitmaps
的像素数据保存在单独的堆中,该堆与应用程序的其余部分分开管理。当Android垃圾收集器清理一个Bitmap
对象时,它还清理位图堆中的像素数据。但是您可以通过Bitmap
上的recycle()
手动调用Bitmap
无效并释放其像素数据,从而更快地实现。
Android为每个正在运行的应用程序分配一个固定大小的位图堆,并且您的应用程序可能会耗尽太多太多的Bitmap
s。这就是为什么如果您的应用程序广泛使用位图,只要您知道不需要它们,就可以从循环位图中获益。
更新:如注释中所述,单独的位图堆适用于Android之前的Honeycomb版本。从Honeycomb开始,位图堆与应用程序堆合并在一起。这是一个SO post with more info。
然后,如果我理解正确有任何“魔法”。如果我在onCreateView之后手动创建一个位图并设置Imageview,我可以预期Android会以释放由图像资源创建的图像的相同方式释放它。 – lujop 2012-08-06 19:00:48
只要您的Activity没有任何引用手动创建的位图(例如,在静态字段或其他东西),它将被垃圾回收器和所有剩余的View对象清理干净。如果您知道您不再需要位图,并且想要为其他位置释放位图堆,则recycle()方法很有用。 – mportuesisf 2012-08-06 19:04:58
这是虽然蜂窝前,因为蜂窝的位图内存与应用程序的其余部分在同一堆。 – Ixx 2012-08-06 19:09:22