使用Bitmap的静态方法createScaledBitmap来创建一个符合规格的Bitmap的时候,原生的bitmap是否需要回收?
代码如下:
private void initDragBitmap() {
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mingren);
mDragBitmap = Bitmap.createScaledBitmap(srcBitmap, FLOAT_BALL_WIDTH, FLOAT_BALL_HEIGHT, true);
srcBitmap.recycle();
}
代码中srcBitmap是否需要回收?
补充问题:
看了大家的回复,基本可以确定如果srcBitmap后续不再使用了,确实是可以手动recycle的,同时它本身也是个局部变量,是可以等待系统GC的。
那新问题来了(或者说我最初想问的问题来了),当createScaledBitmap方法中传入的宽和高跟srcBitmap相同时,通过createScaledBitmap代码注释可以看出它是将srcBitmap返回了,这个时候我强行recycle了srcBitmap,会不会导致mDragBitmap也为null?
源码注释:
/**
* Creates a new bitmap, scaled from an existing bitmap, when possible. If the
* specified width and height are the same as the current width and height of
* the source bitmap, the source bitmap is returned and no new bitmap is
* created.
*
* @param src The source bitmap.
* @param dstWidth The new bitmap's desired width.
* @param dstHeight The new bitmap's desired height.
* @param filter true if the source should be filtered.
* @return The new scaled bitmap or the source bitmap if no scaling is required.
* @throws IllegalArgumentException if width is <= 0, or height is <= 0
*/
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight,
boolean filter) {
}
你可以等待GC去回收,当然,像你这样手动回收是个好习惯。
补答:
会的,如果两个引用都是同一个对象,那么你使用recycle时会让对象中的图片被清理。不过清理的是对象中的图片数据,并不是对象本身,所以说mDragBitmap不会为null,但是使用mDragBitmap中的图片数据时会报错。
你这里可以进行进行一次判断再回收:
如果你确信没有进一步的操作就可以调用其
recycler
方法,释放内存;如果后续有getPixels()
与setPixels()
的调用就不要随意释放内存,等待GC的回收,否则会抛异常。private void initDragBitmap() {
}
就题主以上代码,和大家探讨个问题,是不是用srcBitmap=null;可以尽快让gc回收呢?
带现在的主流版本上,
Google
已经将Bitmap
的内存放到堆中去了,这个回收也交给了gc
,所以楼主不用考虑这个这个问题了。内存不够时就自动回收了。