【问题标题】:How to know that Canvas has used bitmap object如何知道 Canvas 使用了位图对象
【发布时间】:2016-07-16 10:55:51
【问题描述】:

您好,我正在创建 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 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

How to fix "canvas: trying to use a recycled bitmap error"?

trying to use a recycled bitmap android.graphics.Bitmap

Canvas: trying to use a recycled bitmap android.graphics.Bitmap in android

如果我不写最后三行,那就完美了, 可能是因为 Canvas 使用的是位图“结果”对象,而我正在回收“结果”

由于这个位图占用空间很大,我必须回收这个位图,否则我会得到

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

那么有谁知道我怎么能得到这个,“Canvas 已经使用了位图对象,现在我可以回收结果对象了”。

【问题讨论】:

    标签: android android-canvas android-bitmap


    【解决方案1】:

    问题不在于 Canvas 使用了位图。问题是您将 Bi​​tmap 传递给需要它自己绘制的 ImageView 一旦将该 Bitmap 传递给 ImageView,只要 ImageView 还活着,您就无法回收它。

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

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

    【讨论】:

    • 但是@Doug Stevenson 如果我不写 ivBlur.setImageBitmap(result);我仍然收到错误,所以我确定这是 Canvas 的问题
    • 这很可能是位图的大小。画布只是绘制到位图分配的内存中。
    • 是的,这就是为什么我想在使用 Bitmap 后回收位图,这样我就可以避免与内存相关的问题
    • 返回并再次阅读我的答案。如果要在 ImageView 中使用位图,则无法回收它。
    • 对不起,道格,但我已经尝试了一切......当我第一次在 ImageView 上设置位图并回收它时,它没有产生问题......它工作得很好......它在 Canvas 上产生问题仅代码
    猜你喜欢
    • 2018-06-01
    • 2011-10-14
    • 1970-01-01
    • 2015-03-11
    • 2014-10-04
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多