回收ImageView的位图

我有这样的东西:

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多个逐一创build的imageView。 每当我创build新的ImageView,我想从第一个回收'bm'对象,导致这个代码在那里,导致我的堆越来越多,然后抛出OutOfMemoryError ,所以我做:

 bm.recycle() 

在将Bitmap(bm)设置为imageView对象之后。 这会导致ImageView的canvas想要绘制循环位图的exception。

什么是回收已经被放在ImageView上的图像的位图的方式?

Thanksb

在你的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)); } 

如果在所有ImageView上设置相同的位图对象,则不应抛出OutOfMemoryError 。 基本上,这应该工作:

 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()); // ... 

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

  • 使你的位图更小
  • 减less了使用大量内存的其他东西

Devconsole的答案是好的,但是你也可以把所有的位图对象存储在你的类的成员列表中,然后在onDestroy()方法的活动(或者其他使用位图的组件的生命周期方法)叫做。

请勿在任何时候创build超过您所需的图像。 堆的限制旨在防止你挂在自己身上,并完全接pipe设备的有限内存。

如果因为计划放大而需要更多细节,则在缩放时重新渲染图像的这一部分,除了未观看的部分。