android - FATAL EXCEPTION in my app -
in app have error:
e/androidruntime(16123): fatal exception: main e/androidruntime(16123): java.lang.runtimeexception: unable start activity componentinfo{it.bisemanudev.mathtools/it.bisemanudev.mathtools.mainactivity}: android.view.inflateexception: binary xml file line #58: error inflating class <unknown> e/androidruntime(16123): @ android.app.activitythread.performlaunchactivity(activitythread.java:2073) e/androidruntime(16123): @ android.app.activitythread.handlelaunchactivity(activitythread.java:2098) e/androidruntime(16123): @ android.app.activitythread.access$600(activitythread.java:138) e/androidruntime(16123): @ android.app.activitythread$h.handlemessage(activitythread.java:1204) e/androidruntime(16123): @ android.os.handler.dispatchmessage(handler.java:99) e/androidruntime(16123): @ android.os.looper.loop(looper.java:137) e/androidruntime(16123): @ android.app.activitythread.main(activitythread.java:4872) e/androidruntime(16123): @ java.lang.reflect.method.invokenative(native method) e/androidruntime(16123): @ java.lang.reflect.method.invoke(method.java:511) e/androidruntime(16123): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:790) e/androidruntime(16123): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:557) e/androidruntime(16123): @ dalvik.system.nativestart.main(native method) e/androidruntime(16123): caused by: android.view.inflateexception: binary xml file line #58: error inflating class <unknown> e/androidruntime(16123): @ android.view.layoutinflater.createview(layoutinflater.java:613) e/androidruntime(16123): @ com.android.internal.policy.impl.phonelayoutinflater.oncreateview(phonelayoutinflater.java:56) e/androidruntime(16123): @ android.view.layoutinflater.oncreateview(layoutinflater.java:660) e/androidruntime(16123): @ android.view.layoutinflater.createviewfromtag(layoutinflater.java:685) e/androidruntime(16123): @ android.view.layoutinflater.rinflate(layoutinflater.java:746) 05-11 20:21:56.843: e/androidruntime(16123): @ android.view.layoutinflater.rinflate(layoutinflater.java:749) e/androidruntime(16123): @ android.view.layoutinflater.inflate(layoutinflater.java:489) e/androidruntime(16123): @ android.view.layoutinflater.inflate(layoutinflater.java:396) e/androidruntime(16123): @ android.view.layoutinflater.inflate(layoutinflater.java:352) e/androidruntime(16123): @ com.android.internal.policy.impl.phonewindow.setcontentview(phonewindow.java:361) e/androidruntime(16123): @ android.app.activity.setcontentview(activity.java:2043) e/androidruntime(16123): @ it.bisemanudev.mathtools.mainactivity.oncreate(mainactivity.java:27) e/androidruntime(16123): @ android.app.activity.performcreate(activity.java:5191) e/androidruntime(16123): @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1082) e/androidruntime(16123): @ android.app.activitythread.performlaunchactivity(activitythread.java:2037) e/androidruntime(16123): ... 11 more e/androidruntime(16123): caused by: java.lang.reflect.invocationtargetexception e/androidruntime(16123): @ java.lang.reflect.constructor.constructnative(native method) e/androidruntime(16123): @ java.lang.reflect.constructor.newinstance(constructor.java:417) e/androidruntime(16123): @ android.view.layoutinflater.createview(layoutinflater.java:587) e/androidruntime(16123): ... 25 more e/androidruntime(16123): caused by: java.lang.outofmemoryerror e/androidruntime(16123): @ android.graphics.bitmapfactory.nativedecodeasset(native method) e/androidruntime(16123): @ android.graphics.bitmapfactory.decodestream(bitmapfactory.java:500) e/androidruntime(16123): @ android.graphics.bitmapfactory.decoderesourcestream(bitmapfactory.java:353) e/androidruntime(16123): @ android.graphics.drawable.drawable.createfromresourcestream(drawable.java:781) e/androidruntime(16123): @ android.content.res.resources.loaddrawable(resources.java:1969) e/androidruntime(16123): @ android.content.res.resources.getdrawable(resources.java:673) e/androidruntime(16123): @ android.graphics.drawable.statelistdrawable.inflate(statelistdrawable.java:173) e/androidruntime(16123): @ android.graphics.drawable.drawable.createfromxmlinner(drawable.java:881) e/androidruntime(16123): @ android.graphics.drawable.drawable.createfromxml(drawable.java:818) e/androidruntime(16123): @ android.content.res.resources.loaddrawable(resources.java:1954) e/androidruntime(16123): @ android.content.res.typedarray.getdrawable(typedarray.java:601) e/androidruntime(16123): @ android.view.view.(view.java:3347) e/androidruntime(16123): @ android.widget.textview.(textview.java:494) e/androidruntime(16123): @ android.widget.button.(button.java:107) e/androidruntime(16123): @ android.widget.button.(button.java:103) e/androidruntime(16123): ... 28 more
what can solution?
the message pretty self explanatory... you're running out of memory.
check parameters you're passing method, there might many bitmaps being decoded , stored in memory.
consider caching instead of pre-loading bitmaps - load bitmap when need use it. add hasmap (from id actual bitmap). before decoding bitmap check if in map, if don't need decode again. sure check size of map before decoding new bitmaps, , clear cache when necessary don't run out of memory.
edit: here's example how it
edit2: here's full class code. hope didn't make typos.
public class currencyratelistadapter extends baseadapter { // variable used debug log (logcat) private static final string tag = "cc:currencyratelistadapter"; private layoutinflater minflater; private string[] mname; private integer[] mbitmapids; private hashmap<integer, bitmap> mbitmaps; private context mcontext; private cursor mratedata; private double mrate[]; private string mdisplayrate[]; private int mbasecurrencyposition; public currencyratelistadapter(context context, integer[] name, integer[] bitmapid, cursor rate_data) { minflater = layoutinflater.from(context); mbitmaps = new hashmap<integer, bitmap>(); mbitmapids = bitmapid; mcontext = context; mname = new string[name.length]; for(int j=0; j<name.length; j++) { mname[j] = context.getstring(name[j]); } mratedata = rate_data; // update currency rate updatecurrencyrate(); // set default currency mbasecurrencyposition = 0; } @override public void finalize() { log.d(tag, "close sql cursor..."); mratedata.close(); } public int getcount() { return mbitmapids.length; } public object getitem(int position) { return position; } public long getitemid(int position) { return position; } public view getview(int position, view convertview, viewgroup parent) { viewholder holder; //log.d(tag, ">>>>> getview: position=" + integer.tostring(position)); try { if(convertview == null) { // uses currencyratelist.xml display each currency selection convertview = minflater.inflate(r.layout.currencyratelist, null); // create holder view faster access holder = new viewholder(); holder.icon = (imageview) convertview.findviewbyid(r.id.ratelist_icon); holder.name = (textview) convertview.findviewbyid(r.id.ratelist_text); holder.rate = (textview) convertview.findviewbyid(r.id.ratelist_ratetext); // store holder in list convertview.settag(holder); } else { // load holder of view holder = (viewholder) convertview.gettag(); } holder.icon.setimagebitmap(geticon(mbitmapids[position])); holder.name.settext(mname[position]); holder.rate.settext(mdisplayrate[position]); } catch (exception e) { log.e(tag, "getview:" + e.tostring()); } //log.d(tag, "<<<<< getview: position=" + integer.tostring(position)); return convertview; } public void setbasecurrencyindex(int value) { mbasecurrencyposition = value; // update display rate double rate_base = 1.0; if(mbasecurrencyposition < mrate.length) { rate_base = mrate[mbasecurrencyposition]; } mdisplayrate = new string[mratedata.getcount()]; for(int i=0; i<mratedata.getcount(); i++) { mdisplayrate[i] = string.format(locale.us, "%.3f", mrate[i] / rate_base); } } public string getdisplaystring(int position) { string result = "1.000"; if(position < mrate.length) { result = mdisplayrate[position]; } return result; } public void updatecurrencyrate() { log.d(tag, ">>>>> updatecurrencyrate"); // update currency rate data mratedata.requery(); mrate = new double[mratedata.getcount()]; int cnt = mratedata.getcount(); int colcnt = mratedata.getcolumncount(); for(int i=0; i<cnt; i++) { if(mratedata.movetoposition(i) == true) { if(colcnt == 1) { // currency rate data in query result set mrate[i] = mratedata.getdouble(0); } else { // data in query result set // rate data in 2nd column (refer currencyconverterdb class mrate[i] = mratedata.getdouble(1); } } else { mrate[i] = 1.0; } } // deactive currency rate data mratedata.deactivate(); log.d(tag, "<<<<< updatecurrencyrate"); } public double getcurrencyrate(int position) { double rate_sel = 1.0; if(position < mrate.length) { rate_sel = mrate[position]; } return rate_sel; } /* class viewholder */ private class viewholder { imageview icon; textview name; textview rate; } private bitmap geticon(integer bitmapid) { bitmap icon = mbitmaps.get(bitmapid); if (icon == null) { icon = bitmapfactory.decoderesource(mcontext.getresources(), bitmapid); mbitmaps.put(bitmapid, icon); } return icon; } }
Comments
Post a Comment