I'm still seeing this problem. I've used the bitmap.recycle() which
seems to mitigate this problem, but not get rid if it entirely. I'm
only processing one bitmap at a time, I recycle the bitmap, null it,
and call gc().  Runtime.freeMemory() indicates that I have over 10 MB
free memory, none of my bitmaps are over 3.5 MB, I only process one at
a time, yet this problem still occurs intermittently. Is this a bug or
low level memory leak? I've spent a considerable amount of time on
this issue, but cannot seem to resolve it. I'd at least like to know
if this is a documented bug, or if there is any hope of a resolution
in future Android version. The problem seems to arise from
BitmapFactory.decodeFile() . I've communicated with other developers
that seem to have almost the exact same problem. I'd like to at least
know if this is on the radar as a bug, and if there is any chance it
will be dealt with in a future version of Android. Thanks

                                                         Mark




On Jan 8, 3:29 pm, Romain Guy <romain...@google.com> wrote:
> Use less memory. One full screen PNG uses roughly 480*320*4 bytes (~=
> 614k.) Since you enable caching, you are doubling that amount to
> ~1.2MB per view. With 5 views you are using about 6 MB of memory (out
> of 16 MB maximum) just for the background images.
>
>
>
>
>
> On Thu, Jan 8, 2009 at 3:27 PM, Rohit <mord...@gmail.com> wrote:
>
> > 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 -
>
> --
> 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