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 --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---