如何处理未使用的位图对象?

时间:2014-08-08 09:30:47

标签: android bitmap resources

我的应用程序需要每1分钟为某个视图创建一个位图对象

private static Bitmap mBitmap = null;

public static Bitmap getBitmap()
{
   //create new bitmap object
   return mBitmap;
}

我的问题是,在创建新位图之前是否需要销毁mBitmap?

2 个答案:

答案 0 :(得分:1)

使用它之后,您不必手动销毁Bitmap,但可以帮助垃圾收集器完成其工作。有一种名为recycle()的方法,以下段落来自its documentation

  

释放与此位图关联的本机对象,然后清除   参考像素数据。这不会释放像素数据   同步;它只是允许它被垃圾收集,如果有的话   没有其他参考。位图标记为“死”,意思是它   如果调用getPixels()或setPixels(),则会抛出异常   什么都不会。这个操作无法逆转,所以应该如此   只有在你确定没有进一步的用途时才被调用   位图。这是一个高级调用,通常不需要调用,   因为正常的GC过程会在没有时释放这个内存   更多对此位图的引用。

在早期的Android版本中,Bitmaps由操作系统本地处理。这是recycle()方法的原始原因。由于Bitmaps是在Java VM之外处理的,垃圾收集器无法自动释放未使用的Bitmaps的内存,您可以找到有关该here的更多信息,但重要的部分是:

  

在Android 2.3.3(API级别10)及更低版本上,支持像素数据   位图存储在本机内存中。它与位图分开   本身,存储在Dalvik堆中。本机中的像素数据   内存不会以可预测的方式释放,可能导致内存   应用程序短暂超出其内存限制和崩溃。作为   Android 3.0(API级别11),像素数据存储在Dalvik上   堆以及相关的位图。

因此,如果你想支持Android 2.3.3(Gingerbread)或更低版本,你必须小心Bitmaps。你总是要记得打电话给recycle()否则你的应用程序可能会以不可预测的方式崩溃。

如果您只支持Android 3.0以上的Android版本,那么您不必担心释放Bitmap内存,但如果您创建了大量Bitmaps和/或接近{{ 1}}然后在所有不需要的OutOfMemoryExceptions上调用recycle()仍然可以 相当积极的影响。

如果您想了解有关处理Bitmaps的更多信息,请访问this link

我希望我可以帮到你,如果你有任何其他问题,请随时提出。

答案 1 :(得分:-1)

你永远不应该这样做,你应该:

  • 如果大小始终相同(清除并重复使用),则重新使用位图
  • 使用LRU缓存缓存位图

如果你每次调用Bitmap.recycle()然后创建一个新的时候绝对需要销毁它,但这是一个非常非常糟糕的事情。