android - Forcing Portrait mode OOM bitmap resize -
whenever force portrait mode in oncreate
setrequestedorientation(activityinfo.screen_orientation_portrait);
i error
what portrait mode have oom vm budget on image scale?
private void scalefrom(bmpwrap image, bitmap bmp) { if (image.bmp != null && image.bmp != bmp) { image.bmp.recycle(); } if (mdisplayscale > 0.99999 && mdisplayscale < 1.00001) { image.bmp = bmp; return; } int dstwidth = (int)(bmp.getwidth() * mdisplayscale); int dstheight = (int)(bmp.getheight() * mdisplayscale); image.bmp = bitmap.createscaledbitmap(bmp, dstwidth, dstheight, true); } private void resizebitmaps() { scalefrom(mbackground, mbackgroundorig); (int = 0; < mborig.length; i++) { scalefrom(mb[i], mborig[i]); } (int = 0; < mblind.length; i++) { scalefrom(mblind[i], mblindorig[i]); } (int = 0; < mfrozen.length; i++) { scalefrom(mfrozen[i], mfrozenorig[i]); } (int = 0; < mtargeted.length; i++) { scalefrom(mtargeted[i], mtargetedorig[i]); } scalefrom(mblink, mblinkorig); scalefrom(mwon, mwonorig); scalefrom(mlost, mlostorig); mimagesready = true; } java.lang.outofmemoryerror: bitmap size exceeds vm budget @ android.graphics.bitmap.nativecreate(native method) @ android.graphics.bitmap.createbitmap(bitmap.java:498) @ android.graphics.bitmap.createbitmap(bitmap.java:465) @ android.graphics.bitmap.createscaledbitmap(bitmap.java:370) @ com.company.app.view$hread.scalefrom(view.java:313) @ com.company.app.view$hread.resizebitmaps(view.java:337) @ com.company.app.view$hread.setsurfacesize(view.java:480) @ com.company.app.view.surfacechanged(view.java:905) @ android.view.surfaceview.updatewindow(surfaceview.java:538) @ android.view.surfaceview.dispatchdraw(surfaceview.java:339) @ android.view.viewgroup.drawchild(viewgroup.java:1638) @ android.view.viewgroup.dispatchdraw(viewgroup.java:1367) @ android.view.viewgroup.drawchild(viewgroup.java:1638) @ android.view.viewgroup.dispatchdraw(viewgroup.java:1367) @ android.view.view.draw(view.java:6745) @ android.widget.framelayout.draw(framelayout.java:352) @ android.view.viewgroup.drawchild(viewgroup.java:1640) @ android.view.viewgroup.dispatchdraw(viewgroup.java:1367) @ android.view.view.draw(view.java:6745) @ android.widget.framelayout.draw(framelayout.java:352) @ com.android.internal.policy.impl.phonewindow$decorview.draw(phonewindow.java:1891) @ android.view.viewroot.draw(viewroot.java:1416) @ android.view.viewroot.performtraversals(viewroot.java:1172) @ android.view.viewroot.handlemessage(viewroot.java:1736) @ android.os.handler.dispatchmessage(handler.java:99) @ android.os.looper.loop(looper.java:143) @ android.app.activitythread.main(activitythread.java:4701) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:521) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:868) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:626) @ dalvik.system.nativestart.main(native method)
whenever orientation change, app reloaded entirely except static properties. (read here : http://developer.android.com/reference/android/app/activity.html)
this means bitmap allocated if not static reloaded. since memory allowed 1 app 16 mb(24 on devices hear) , bitmap stored in memory raw bitmap(read not compressed) create spike in memory usage can lead oom
add fact memory used bitmaps allocated outside of heap memory counted if part of can't trace problem using ddms or mat.
be sure recycle bitmaps in ondestroy method can garbage collected.
the 1 thing got me out of 1 these 3 lines of code(hack) :
system.gc(); system.runfinalization(); system.gc();
beware though, impacts performance(about 500 750 ms) not suitable game fps concern app reasonable.
put them @ beginning of createscaledbitmap call.
it worked me
edit :
depending on doing bitmap in question can ask android open downsampled, taking less memory. wrote function while dealing problem. tries open bitmap big possible :
private bitmap getdownsampledbitmapfromfile(string filename, int samplesize) { //try free memory system.gc(); system.runfinalization(); system.gc(); bitmapfactory.options options=new bitmapfactory.options();//reset object byte[] tempbuffer=new byte[8000]; options.intempstorage = tempbuffer; options.insamplesize=samplesize; bitmap downsampledbitmap = null; try { downsampledbitmap = bitmapfactory.decodefile(filenametoupload, options); } catch (outofmemoryerror e) { samplesize ++; } return(downsampledbitmap); }
Comments
Post a Comment