Android 如何知道画布使用了位图对象

Android 如何知道画布使用了位图对象,android,android-canvas,android-bitmap,Android,Android Canvas,Android Bitmap,嗨,我正在创建位图对象并在画布中使用,如下面的代码 Bitmap result = Bitmap.createBitmap(loadedImage.getWidth(), loadedImage.getHeight(), Config.ARGB_8888); Canvas mCanvas = new Canvas(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuf

嗨,我正在创建位图对象并在画布中使用,如下面的代码

Bitmap result = Bitmap.createBitmap(loadedImage.getWidth(), loadedImage.getHeight(), Config.ARGB_8888);
Canvas mCanvas = new Canvas(result);    
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mCanvas.drawBitmap(blurBitmap, 0, 0, null);
mCanvas.drawBitmap(loadedImage, 0, 0, paint);
paint.setXfermode(null);

ivBlur.setImageBitmap(result);

// now i don't want Bitmap "result" so I am recycling it    
if (result != null && !result.isRecycled())
    result.recycle();
}
但是从上面的代码中我得到了一个错误,比如

尝试使用回收位图android

如果我不写最后三行,它就工作得很好, 这可能是因为画布正在使用位图“结果”对象,而我正在循环使用“结果”

因为这个位图占用了很大的空间,所以我必须回收这个位图,否则我会得到它

java.lang.OutofMemoryError:位图大小超出VM预算。


那个么,有人知道我是如何得到这个结果的吗,“画布已经使用了位图对象,现在我可以循环使用结果对象了”

问题不在于画布使用了位图。问题是,您将位图传递给了需要它自己绘制的ImageView。一旦将位图传递给ImageView,只要ImageView处于活动状态,就无法回收该位图

只有在将带有位图的ImageView从视图层次结构中删除且不再使用后,才能循环使用位图。在这种情况下,让垃圾收集器来处理它更容易


如果需要较小的位图,则应在将其发送到ImageView之前创建并绘制该较小的位图。

问题不在于画布使用了位图。问题是,您将位图传递给了需要它自己绘制的ImageView。一旦将位图传递给ImageView,只要ImageView处于活动状态,就无法回收该位图

只有在将带有位图的ImageView从视图层次结构中删除且不再使用后,才能循环使用位图。在这种情况下,让垃圾收集器来处理它更容易


如果您需要一个较小的位图,则应在将其发送到ImageView之前创建并绘制该较小的位图。

但是@Doug Stevenson如果我不编写ivBlur.setImageBitmap(结果);我仍然得到一个错误,所以我确信这是画布的问题,它很可能是位图的大小。Canvas只是把位图分配到内存中。是的,这就是为什么我想在使用位图后回收位图,这样我就可以避免与内存相关的问题,并再次读取我的答案。如果要在ImageView中使用位图,则无法回收该位图。对不起,道格,我已尝试了所有操作。。。当我第一次在ImageView上设置位图并循环使用它时,它并没有产生问题。。。它工作得很好。。。。如果我不写ivBlur.setImageBitmap(结果),它只会在画布代码上产生问题,但@Doug Stevenson;我仍然得到一个错误,所以我确信这是画布的问题,它很可能是位图的大小。Canvas只是把位图分配到内存中。是的,这就是为什么我想在使用位图后回收位图,这样我就可以避免与内存相关的问题,并再次读取我的答案。如果要在ImageView中使用位图,则无法回收该位图。对不起,道格,我已尝试了所有操作。。。当我第一次在ImageView上设置位图并循环使用它时,它并没有产生问题。。。它工作得很好。。。。这只会在画布代码上产生问题