1

通常我总是使用Drawable资源,Imageviews因为我没有手动释放它们。

但在某些情况下,我需要动态创建位图,然后我必须recycle()onDestroy(). 这是我根据其他 StackOverflow 问题找到的最佳解决方案。

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

4

1 回答 1

0

ADrawable比 a 广泛得多BitmapDrawable旨在表示图形系统可以呈现给显示器的任何内容。有一些不包含s 的子类,Drawable例如 asShapeDrawable或-,因此不需要任何类型的手动内存管理。ColorDrawableBitmap

ABitmapDrawable包装 aBitmap并包含对 a 的引用Bitmap。这Bitmap很特别,因为 Android 将所有像素数据保存Bitmaps在一个单独的堆中,该堆与应用程序的其余部分分开管理。当 Android 垃圾收集器清理Bitmap对象时,它也会清理位图堆中的像素数据。recycle()但是您可以通过手动调用来强制它更快发生Bitmap,这会标记Bitmap无效并释放其像素数据。

BitmapAndroid 为每个正在运行的应用程序分配一个固定大小的位图堆,您的应用程序可能会因为一次使用过多的 s 而耗尽其堆。这就是为什么如果您的应用程序广泛使用位图,一旦您知道不再需要位图,您可能会从回收位图中受益。

更新:如评论中所述,单独的位图堆适用于 Android 的 Honeycomb 之前的版本。从 Honeycomb 开始,位图堆与应用程序堆合并。这是一个包含更多信息的 SO 帖子

于 2012-08-06T18:53:56.397 回答