通常我总是使用Drawable
资源,Imageviews
因为我没有手动释放它们。
但在某些情况下,我需要动态创建位图,然后我必须recycle()
在onDestroy()
. 这是我根据其他 StackOverflow 问题找到的最佳解决方案。
我想了解 Android 是如何管理Drawable
资源的,以及为什么我没有手动回收它们。并且当了解后,看看是否可以将类似的逻辑应用于手动创建的位图。
通常我总是使用Drawable
资源,Imageviews
因为我没有手动释放它们。
但在某些情况下,我需要动态创建位图,然后我必须recycle()
在onDestroy()
. 这是我根据其他 StackOverflow 问题找到的最佳解决方案。
我想了解 Android 是如何管理Drawable
资源的,以及为什么我没有手动回收它们。并且当了解后,看看是否可以将类似的逻辑应用于手动创建的位图。
ADrawable
比 a 广泛得多Bitmap
。 Drawable
旨在表示图形系统可以呈现给显示器的任何内容。有一些不包含s 的子类,Drawable
例如 asShapeDrawable
或-,因此不需要任何类型的手动内存管理。ColorDrawable
Bitmap
ABitmapDrawable
包装 aBitmap
并包含对 a 的引用Bitmap
。这Bitmap
很特别,因为 Android 将所有像素数据保存Bitmaps
在一个单独的堆中,该堆与应用程序的其余部分分开管理。当 Android 垃圾收集器清理Bitmap
对象时,它也会清理位图堆中的像素数据。recycle()
但是您可以通过手动调用来强制它更快发生Bitmap
,这会标记Bitmap
无效并释放其像素数据。
Bitmap
Android 为每个正在运行的应用程序分配一个固定大小的位图堆,您的应用程序可能会因为一次使用过多的 s 而耗尽其堆。这就是为什么如果您的应用程序广泛使用位图,一旦您知道不再需要位图,您可能会从回收位图中受益。
更新:如评论中所述,单独的位图堆适用于 Android 的 Honeycomb 之前的版本。从 Honeycomb 开始,位图堆与应用程序堆合并。这是一个包含更多信息的 SO 帖子。