回收图像视图的位图

2022-09-01 04:32:14

我有这样的东西:

Bitmap.Config conf = Bitmap.Config.ARGB_8888;
WeakReference<Bitmap> bm = new WeakReference<Bitmap>(Bitmap.createBitmap(3000 + 3000, 2000, conf));

Canvas canvas = new Canvas(bm.get());
canvas.drawBitmap(firstBitmap, 0, 0, null);
canvas.drawBitmap(bm, firstBitmap.getWidth(), 0, null);

imageView.setImageBitmap(bm);

我将其应用于10多个图像视图,这些图像视图是逐个创建的。每当我创建新的 ImageView 时,我都想从第一个对象中回收 'bm' 对象,导致此代码在那里,导致我的堆变得越来越大,然后抛出 OutOfMemoryError,所以我这样做:

bm.recycle()

在我设置位图(bm)到imageView对象之后。这会导致图像视图的画布想要绘制回收的位图的异常。

回收已作为图像放在 ImageView 上的位图的方法是什么?

谢谢


答案 1

在你的 onDestroy 方法中,你可以尝试这样的事情:

ImageView imageView = (ImageView)findViewById(R.id.my_image);
Drawable drawable = imageView.getDrawable();
if (drawable instanceof BitmapDrawable) {
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
    Bitmap bitmap = bitmapDrawable.getBitmap();
    bitmap.recycle();
}

强制转换应该有效,因为setImageBitmap被实现为

public void setImageBitmap(Bitmap bm) {
    setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}

答案 2

如果在所有 s 上设置相同的位图对象,则不应抛出 .基本上,这应该有效:ImageViewOutOfMemoryError

WeakReference<Bitmap> bm = new WeakReference<Bitmap>(Bitmap.createBitmap(3000 + 3000, 2000, Bitmap.Config.ARGB_8888));

Canvas canvas = new Canvas(bm.get());
canvas.drawBitmap(firstBitmap, 0, 0, null);
canvas.drawBitmap(bm, firstBitmap.getWidth(), 0, null);

imageView1.setImageBitmap(bm.get());
imageView2.setImageBitmap(bm.get());
imageView3.setImageBitmap(bm.get());
imageView4.setImageBitmap(bm.get());
imageView5.setImageBitmap(bm.get());
// ...

如果这不起作用,那只是意味着你的位图太大了(如果我计算正确的话,6000x2000像素大约是12兆字节)。您可以:

  • 使位图更小
  • 减少使用大量内存的其他内容

推荐