java - How to reduce memory usage in Android? -


i want display random images drawable folder when press button.

i named photos "img_0"...to "img_51"

this tried :

imageview card1, card2, card3, card4, card5; button bplay;  arraylist<integer> numbers = new arraylist<integer>(); random randomgenerator = new random();  @override protected void oncreate(bundle savedinstancestate) {     super.oncreate(savedinstancestate);      requestwindowfeature(window.feature_no_title);     getwindow().setflags(windowmanager.layoutparams.flag_fullscreen,             windowmanager.layoutparams.flag_fullscreen);      setrequestedorientation(activityinfo.screen_orientation_landscape);      setcontentview(r.layout.activity_play);      setreferences(); }   private void setreferences() {     card1 = (imageview) findviewbyid(r.id.card1);     card2 = (imageview) findviewbyid(r.id.card2);     card3 = (imageview) findviewbyid(r.id.card3);     card4 = (imageview) findviewbyid(r.id.card4);     card5 = (imageview) findviewbyid(r.id.card5);     bplay = (button) findviewbyid(r.id.bplay2);     bplay.setonclicklistener(this); }  private void getrandomnumbers() {     while(numbers.size() < 5) {         int random = randomgenerator .nextint(51);         if (!numbers.contains(random)) {             numbers.add(random);         }     } }  private void cleararraylist() {     for(int = numbers.size()-1 ; >= 0; i--){         numbers.remove(numbers.get(i));     } }  private void setbitmap(imageview iv, int n) {     string str = "img_" + numbers.get(n);      int resid = getresources().getidentifier(str, "drawable",  getpackagename());     iv.setimageresource(resid); }  @override public void onclick(view v) {     getrandomnumbers();      setbitmap(card1, 0);     setbitmap(card2, 1);     setbitmap(card3, 2);     setbitmap(card4, 3);     setbitmap(card5, 4);      cleararraylist(); } 

i looking in memory tab emulator, , saw memory highly used...

how can reduce memory usage? when press 1 time button has 70 , in vm heap.

any idea welcomed !

i tried bitmap , recycle gives me error.. application has stopped working...

here tried :

private void setbitmap(imageview iv, int n) {         string str = "img_" + numbers.get(n);         bitmap bitmap = bitmapfactory.decoderesource(getresources(), getresourceid(str, "drawable",                 this));         iv.setimagebitmap(bitmap);         bitmap.recycle();     } 

here logcat :

    07-10 16:57:10.402    1906-1906/? i/art﹕ not late-enabling -xcheck:jni (already on) 07-10 16:57:14.321    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker d/openglrenderer﹕ use egl_swap_behavior_preserved: true 07-10 16:57:14.335    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker d/﹕ hostconnection::get() new host connection established 0xb4a93f40, tid 1906 07-10 16:57:14.349    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker d/atlas﹕ validating map... 07-10 16:57:14.813    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker d/﹕ hostconnection::get() new host connection established 0xb4b270b0, tid 1937 07-10 16:57:14.957    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker i/openglrenderer﹕ initialized egl, version 1.4 07-10 16:57:15.032    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker d/openglrenderer﹕ enabling debug mode 0 07-10 16:57:15.054    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker w/egl_emulation﹕ eglsurfaceattrib not implemented 07-10 16:57:15.063    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker w/openglrenderer﹕ failed set egl_swap_behavior on surface 0xb4b23b00, error=egl_success 07-10 16:57:15.169    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/choreographer﹕ skipped 38 frames!  application may doing work on main thread. 07-10 16:57:16.748    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/choreographer﹕ skipped 93 frames!  application may doing work on main thread. 07-10 16:57:22.533    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker w/egl_emulation﹕ eglsurfaceattrib not implemented 07-10 16:57:22.533    1906-1937/com.symplyfyweb.gherghina.oldschoolwesternpoker w/openglrenderer﹕ failed set egl_swap_behavior on surface 0xb4b23cc0, error=egl_success 07-10 16:57:23.378    1906-1913/com.symplyfyweb.gherghina.oldschoolwesternpoker w/art﹕ suspending threads took: 19.779ms 07-10 16:57:28.898    1906-1913/com.symplyfyweb.gherghina.oldschoolwesternpoker w/art﹕ suspending threads took: 12.510ms 07-10 16:57:31.940    1906-1918/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.352    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc sticky concurrent mark sweep gc freed 8(432b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 1.468ms total 17.160ms 07-10 16:57:32.378    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.378    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc partial concurrent mark sweep gc freed 14(576b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 889us total 19.090ms 07-10 16:57:32.444    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.444    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc concurrent mark sweep gc freed 8(12kb) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 789us total 57.650ms 07-10 16:57:32.451    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ forcing collection of softreferences 12mb allocation 07-10 16:57:32.501    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.502    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc concurrent mark sweep gc freed 11(288b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 799us total 49.442ms 07-10 16:57:32.507    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker e/art﹕ throwing outofmemoryerror "failed allocate 13068012 byte allocation 1263808 free bytes , 1234kb until oom" 07-10 16:57:32.524    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc sticky concurrent mark sweep gc freed 5(448b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 731us total 14.526ms 07-10 16:57:32.550    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.551    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc partial concurrent mark sweep gc freed 10(376b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 954us total 19.113ms 07-10 16:57:32.664    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.665    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc concurrent mark sweep gc freed 3(96b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 1.193ms total 108.749ms 07-10 16:57:32.675    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker w/art﹕ suspending threads took: 9.507ms 07-10 16:57:32.675    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ forcing collection of softreferences 12mb allocation 07-10 16:57:32.770    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ clamp target gc heap 66mb 64mb 07-10 16:57:32.770    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker i/art﹕ alloc concurrent mark sweep gc freed 3(96b) allocspace objects, 0(0b) los objects, 1% free, 62mb/64mb, paused 11.517ms total 93.336ms 07-10 16:57:32.775    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker e/art﹕ throwing outofmemoryerror "failed allocate 13068012 byte allocation 1263992 free bytes , 1234kb until oom" 07-10 16:57:32.777    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker d/skia﹕ --- allocation failed scaled bitmap 07-10 16:57:32.779    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker d/androidruntime﹕ shutting down vm     --------- beginning of crash 07-10 16:57:32.802    1906-1906/com.symplyfyweb.gherghina.oldschoolwesternpoker e/androidruntime﹕ fatal exception: main     process: com.symplyfyweb.gherghina.oldschoolwesternpoker, pid: 1906     java.lang.outofmemoryerror: failed allocate 13068012 byte allocation 1263992 free bytes , 1234kb until oom             @ dalvik.system.vmruntime.newnonmovablearray(native method)             @ android.graphics.bitmapfactory.nativedecodeasset(native method)             @ android.graphics.bitmapfactory.decodestream(bitmapfactory.java:609)             @ android.graphics.bitmapfactory.decoderesourcestream(bitmapfactory.java:444)             @ android.graphics.bitmapfactory.decoderesource(bitmapfactory.java:467)             @ android.graphics.bitmapfactory.decoderesource(bitmapfactory.java:497)             @ com.symplyfyweb.gherghina.oldschoolwesternpoker.playactivity.setbitmap(playactivity.java:97)             @ com.symplyfyweb.gherghina.oldschoolwesternpoker.playactivity.onclick(playactivity.java:112)             @ android.view.view.performclick(view.java:4780)             @ android.view.view$performclick.run(view.java:19866)             @ android.os.handler.handlecallback(handler.java:739)             @ android.os.handler.dispatchmessage(handler.java:95)             @ android.os.looper.loop(looper.java:135)             @ android.app.activitythread.main(activitythread.java:5257)             @ java.lang.reflect.method.invoke(native method)             @ java.lang.reflect.method.invoke(method.java:372)             @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:903)             @ com.android.internal.os.zygoteinit.main(zygoteinit.java:698) 

you should cache images need loaded 1 time.

it simple, have when go load bitmap, check see if it's in cache , if use that. if isn't load image. prevent loading resources multiple times.

hashmap<string, integer> rescache = new hashmap<string, integer>(); ... ... private void setbitmap(imageview iv, int n) {     string str = "img_" + numbers.get(n);     int resid = -1;     if  (rescache.containskey(str)) {         resid = rescache.get (str);     } else {         resid = getresources().getidentifier(str, "drawable",  getpackagename());         rescache.put (str, resid);     }     iv.setimageresource(resid); } 

Comments