通常情况下,我总是在Drawable
中使用Imageviews
资源,因为我无需手动释放它们。
但在某些情况下,我需要动态创建位图,然后在recycle()
中手动调用onDestroy()
。这是我根据that other StackOverflow question找到的最佳解决方案。
我想了解Android如何管理Drawable
资源以及为什么我不必手动回收它们。当理解时,看看是否可以将类似的逻辑应用于手动创建的位图。
答案 0 :(得分:0)
Drawable
比Bitmap
宽得多。 Drawable
旨在表示图形系统可以呈现给显示器的任何内容。有Drawable
的子类 - 例如ShapeDrawable
或ColorDrawable
- 不包含Bitmap
,因此不需要任何类型的手动内存管理。
BitmapDrawable
包裹Bitmap
并包含对Bitmap
的引用。 Bitmap
是特殊的,因为Android会在单独的堆中维护所有Bitmaps
的像素数据,该堆与应用程序的其余部分分开管理。当Android垃圾收集器清除Bitmap
对象时,它还会清除位图堆中的像素数据。但是,您可以通过recycle()
上的Bitmap
手动调用Bitmap
来强制它发生,这会标记Bitmap
无效并释放其像素数据。
Android为每个正在运行的应用程序分配一个固定大小的位图堆,并且您的应用可能会通过一次使用太多{{1}}来耗尽其堆。这就是为什么如果您的应用程序广泛使用位图,一旦您知道不需要它们,您可能会从回收位图中受益。
更新:如评论中所述,单独的位图堆适用于预先Honeycomb版本的Android。从Honeycomb开始,位图堆与应用程序堆合并。这是一个SO post with more info。