Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recycle ImageView's Bitmap

I have something like this:

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); 

And I apply this on more than 10 imageView's which are created one by one. Whenever I create new ImageView, I want to recycle the 'bm' object from the first one, cause this code up there, causes my heap to grow more and more and then throw OutOfMemoryError, so I do:

bm.recycle() 

right after I set the Bitmap (bm) to the imageView object. This causes exception that the ImageView's canvas wants to draw recycled Bitmap.

What is the way to recycle a Bitmap that has already been put as image on ImageView?

Thanksb

like image 689
Peter Olsbourg Avatar asked Aug 10 '11 10:08

Peter Olsbourg


2 Answers

In your onDestroy method you could try something like this:

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(); } 

The cast should work since setImageBitmap is implemented as

public void setImageBitmap(Bitmap bm) {     setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); } 
like image 155
devconsole Avatar answered Oct 06 '22 00:10

devconsole


If you set the same bitmap object on all your ImageViews, it shouldn't throw an OutOfMemoryError. Basically, this should work:

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

If this doesn't work, it simply means your bitmap is too large (6000x2000 pixels is about 12 megabytes, if I calculated right). You can either:

  • make your bitmap smaller
  • cut down on other stuff that use a lot of memory
like image 22
Felix Avatar answered Oct 05 '22 22:10

Felix