I am setting the Background (using view.setBackgroundResource()) of
about 5 views with pngs that fill up the entire screen (as a
backdrop). I scroll between these 5 views and thus want to keep them
in cache (I use view.setChildrenCacheEnabled()) but I run into the
OutOfMemoryError: bitmap exceeds VM budget error. Is there a way to
overcome it?

Rohit


n Dec 17 2008, 11:20 am, Mark K <mark.ka...@gmail.com> wrote:
> Thanks for the beta on the bitmap,recycle(), it works! Before
> processing the next bitmap I use this code to free up memory. I have a
> class level Bitmap object.
>
>                                 Bitmap bm;// class level
>
>                                 if (bm!=null)
>                 {
>                          bm.recycle();
>                          try
>                          {
>                                 Thread.sleep(100);
>                          }
>                          catch(Exception e){}
>                          bm=null;
>                          System.gc();
>                          try
>                          {
>                                 Thread.sleep(100);
>                          }
>                          catch(Exception e){}
>                 }
>                                // create new bitmap and start again.
>
> Thanks again, it works!
>
> On Dec 17, 5:56 am, Mike Reed <r...@google.com> wrote:
>
> > Its a little raw, but if you know you're absolutely done using a given  
> > bitmap object, you can call bitmap.recycle(). This immediately frees  
> > up the memory associated with the bitmap, and marks it as "dead",  
> > meaning it cannot be referenced again (i.e. don't try to draw or get/
> > set its pixels anymore).
>
> > i.e.
>
> > for (all of my big images) {
> >      Bitmap b = decode(...);
> >      canvas.drawBitmap(b, ...);
> >      b.recycle();
> >      // yikes, don't reference b again)
>
> > }
>
> > On Dec 15, 2008, at 9:04 PM, Mark K wrote:
>
> >   Is there a work around for this problem? Something I need to do
> > differently perhaps? It seems like garbage collection is not occurring
> > between successive bitmap decoding operations. Explicitly calling gc()
> > does not seem to help. This is particularly a problem on the G1,
> > because there is no way to reduce the camera resolution, all of the
> > camera pictures are large. If I loop through a directory of pictures
> > taken by the camera and use BitmapFactory.decodeFile(), I will get an
> > out of memory error on the 2nd or 3rd iteration. Since I am only
> > displaying/decoding one bitmap at a time I would hope that garbage
> > collection would free up the memory between operations such that this
> > does not occur. Any help would be greatly appreciated. Here's the code
> > I use: This code runs a slide show of the images in the camera
> > directory, it uses Handler.postDelayed() to render each picture. Is
> > there anyway to tweak the code to get rid of the out of memory
> > problem.
>
> > public boolean slideShow()
> >     {
> >         String baseDir = "/sdcard/dcim/Camera/";
> >         long showTime = 1500;
>
> >         File dir = new File(baseDir);
> >         File[] pics = dir.listFiles();
> >         for ( int i=0; i<pics.length; i++ )
> >         {
> >                 String pic=baseDir+pics[i].getName();
> >                 handler.postDelayed(new ShowSlide(pic), i*showTime);
> >         }
> >         return true;
> >     }
>
> > class ShowSlide extends Thread
> >     {
> >         String pc="";
> >         public ShowSlide(String pc)
> >         {
> >                 this.pc=pc;
> >         }
> >         public void run()
> >         {
> >                 System.out.println("Showing picture: "+pc.toString());
> >                 displayPicture(pc);
> >         }
> >     }
>
> > public boolean displayPicture(String filepath)
> >     {
> >                File file = new File(filepath);
> >                 BitmapFactory bfac = new BitmapFactory();
> >         try
> >         {
> >                 bm = bfac.decodeFile(filepath);// out of memory error occurs
> > here!
> >                 handler.post(new SetImage(iView, bm));
> >         }
> >         catch(Exception e)
> >         {
> >            Log.e(TAG,"display picture failed: "+filepath+" "+e.toString
> > ());
> >            e.printStackTrace();
> >            return false;
> >         }
>
> >         return true;
> >     }
>
> > class SetImage extends Thread
> >     {
> >         ImageView vv;
> >         Bitmap bb;
> >         public SetImage(ImageView vv, Bitmap bb)
> >         {
> >                 this.vv=vv;
> >                 this.bb=bb;
> >         }
> >         public void run()
> >         {
> >                 vv.setImageBitmap(bb);
> >         }
> >     }
>
> > On Dec 15, 2:48 pm, Romain Guy <romain...@google.com> wrote:
>
> > >>  I've run into this exact same problem a number of times myself. Not
> > >> sure if its a bug or just a limitation of the jvm, can't seem to
> > >> process more than a few large bitmaps without this occuring, this
> > >> always seems to occur when decoding bitmaps from file.
>
> > > Neither, you are just using too much memory.
>
> > > --
> > > Romain Guy
> > > Android framework engineer
> > > romain...@android.com
>
> > > Note: please don't send private questions to me, as I don't have time
> > > to provide private support.  All such questions should be posted on
> > > public forums, where I and others can see and answer them- Hide quoted 
> > > text -
>
> > - Show quoted text -
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to