Android中我们会用到大量的图片加载,因此,我们也会不可避免的用到Bitmap,对于Bitmap加载图片在这里就不作解释了,有需要的可以自行百度。
最近在项目中碰到了很严重的内存泄漏问题,老板下令必须查清楚原因,然后就加班一点带你盘查,最后发现我们的APP中用到了大量的图片资源,就怀疑是Bitmap引起的:
1.ImagView在被销毁的时候会自己释放资源,因此我们很少去主动释放资源,后面发现这样是不行的,虽然说Bitmap不再被引用时他会自己释放资源但是它是不及时的,所以当遇到不被占用的资源时我们应该及时的去调用recycle()方法将bitmap资源释放掉
2.Activity中的Bitmap对象,如果是成员变量,需要在onDestroy()中明确释放。 因为,即使在Activity调用Finish()结束后,虚拟机都不会立即回收Bitmap的内存(什么时候回收不得 而知),所以如一个Activity 中会创建一个很大的Bitmap,在Activiy结束后没有明确释放,多次调用 这个Activity后,容易发生内存溢出错误,但是我们应该在什么时候回收Bitmap在确定这个Bitmap不再被使用的时候,如果回收之后再次使用,就会抛出异常。所以一定要保证不再使用的时候释放,比如,如果是在某个Activity中使用Bitmap,就可以在Activity的onStop()或者onDestroy()方法中进行回收。
下面是一段回收Bitmap的代码:
// 先判断是否已经回收
if(bitmap != null && !bitmap.isRecycled()){
// 回收并且置为null
bitmap.recycle();
bitmap = null;
}
System.gc();
但是因为Bitmap是吃内存大户,为了避免应用在分配Bitmap内存的时候出现OutOfMemory异常以后Crash掉,需要特别注意实例化Bitmap部分的代码。通常,在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获。
Bitmap bitmap = null;
try {
// 实例化Bitmap
bitmap = BitmapFactory.decodeFile(path);
} catch (OutOfMemoryError e) {
//
}
if (bitmap == null) {
// 如果实例化失败 返回默认的Bitmap对象
return defaultBitmapMap;
}