我的应用程序需要每1分钟为某个视图创建一个位图对象
private static Bitmap mBitmap = null;
public static Bitmap getBitmap()
{
//create new bitmap object
return mBitmap;
}
我的问题是,在创建新位图之前是否需要销毁mBitmap?
答案 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)
你永远不应该这样做,你应该:
如果你每次调用Bitmap.recycle()然后创建一个新的时候绝对需要销毁它,但这是一个非常非常糟糕的事情。