android - Out of memory on a 322013-byte allocation -


i want display bitmap flickr in staggeredgrid layout. photos display @ beginning. however, when scroll images down further, returns "error - out of memory". how avoid out of memory error when displaying bitmap images? below log:

    e/dalvikvm-heap: out of memory on 322013-byte allocation. 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm: "thread-557" prio=5 tid=13 runnable 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:   | group="main" scount=0 dscount=0 obj=0x4251a118 self=0x5f496370 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:   | systid=25360 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1598646248 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:   | state=r schedstat=( 24035935571 12370314782 38194 ) utm=2070 stm=333 core=1 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:     @ java.io.bytearrayoutputstream.tobytearray(bytearrayoutputstream.java:~122) 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:     @ com.android.volley.toolbox.basicnetwork.entitytobytes(basicnetwork.java:222) 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:     @ com.android.volley.toolbox.basicnetwork.performrequest(basicnetwork.java:105) 01-21 09:56:42.718 25341-25360/com.example.myapp i/dalvikvm:     @ com.android.volley.networkdispatcher.run(networkdispatcher.java:105) 01-21 09:56:42.718 25341-25360/com.example.myapp w/dalvikvm: threadid=13: thread exiting uncaught exception (group=0x4174cd58) 01-21 09:56:42.718 25341-25360/com.example.myapp i/process: sending signal. pid: 25341 sig: 9 01-21 09:56:42.838 1057-1399/? i/activitymanager: process com.example.myapp (pid 25341) has died. 01-21 09:56:42.878 1057-1068/? w/inputmethodmanagerservice: got remoteexception sending setactive(false) notification pid 25341 uid 10186 01-21 09:56:42.878 1315-1326/? w/binder: caught runtimeexception binder stub implementation.                                          java.lang.nullpointerexception                                              @ android.inputmethodservice.iinputmethodwrapper.setsessionenabled(iinputmethodwrapper.java:280)                                              @ com.android.internal.view.iinputmethod$stub.ontransact(iinputmethod.java:129)                                              @ android.os.binder.exectransact(binder.java:404)                                              @ dalvik.system.nativestart.run(native method) 

below program getting images flickr

@suppresslint("validfragment") public class fragmentrecent extends fragment implements fragmentmanager.onbackstackchangedlistener{     // todo: rename parameter arguments, choose names match     // fragment initialization parameters, e.g. arg_item_number     private static final string arg_param1 = "param1";     private static final string arg_param2 = "param2";      private staggeredgridview mstaggeredview;     private requestqueue mvolleyqueue;     private progressdialog mprogress;     private int currpage=1;     gsonrequest<flickrresponsephotos> gsonobjrequest;      private relativelayout mlistfooter;     private boolean isloading = false;      private final string tag_request = "my_tag";      private staggeredgridview.onscrolllistener scrolllistener = new staggeredgridview.onscrolllistener() {         public void ontop() {         }          public void onscroll() {             loadmoredata();//edit onbottom         }          public void onbottom() {            // loadmoredata(); tbs commented out loading new data while scrolling         }     };      private void loadmoredata() {          if ( isloading )             return;          mlistfooter.setvisibility(view.visible);         isloading = true;         flickergetimagesrequest();     }      private void flickergetimagesrequest() {         {              string url = "https://api.flickr.com/services/rest";             uri.builder builder = uri.parse(url).buildupon();             builder.appendqueryparameter("api_key", "5e045abd4baba4bbcd866e1864ca9d7b");             //builder.appendqueryparameter("method", "flickr.interestingness.getlist"); //tbs             builder.appendqueryparameter("method", "flickr.photos.search");             builder.appendqueryparameter("tags",mmenuchoice);             //builder.appendqueryparameter("sort","relevance");             builder.appendqueryparameter("format", "json");             builder.appendqueryparameter("nojsoncallback", "1");          //   builder.appendqueryparameter("per_page", "10");             builder.appendqueryparameter("page", integer.tostring(currpage));              gsonobjrequest = new gsonrequest<flickrresponsephotos>(request.method.get, builder.tostring(),                     flickrresponsephotos.class, null, new response.listener<flickrresponsephotos>() {                 @override                 public void onresponse(flickrresponsephotos response) {                     try {                         if(response != null) {                             parseflickrimageresponse(response);                             currpage++;                         }                     } catch (exception e) {                         e.printstacktrace();                         showtoast("json parse error");                     }                     stopprogress();                 }             }, new response.errorlistener() {                  @override                 public void onerrorresponse(volleyerror error) {                     // handle error types accordingly.for timeout & no connection error, can show 'retry' button.                     // authfailure, can re login user credentials.                     // clienterror, 400 & 401, errors happening on client side when sending api request.                     // in case can check how client forming api , debug accordingly.                     // servererror 5xx, can retry or handle accordingly.                     if( error instanceof networkerror) {                     } else if( error instanceof clienterror) {                     } else if( error instanceof servererror) {                     } else if( error instanceof authfailureerror) {                     } else if( error instanceof parseerror) {                     } else if( error instanceof noconnectionerror) {                     } else if( error instanceof timeouterror) {                     }                     //mstaggeredview.onrefreshcomplete();                     stopprogress();                     showtoast(error.getmessage());                 }             });             gsonobjrequest.settag(tag_request);             mvolleyqueue.add(gsonobjrequest);         }     }      private void parseflickrimageresponse(flickrresponsephotos response) {         flickrgetimagesresponse photos = response.getphotos(); //pass array of images picture activity         string[] photourl;         photourl = new string[photos.getphotos().size()];         (int index = 0; index < photos.getphotos().size(); index++) {              flickrimage flkrimage = photos.getphotos().get(index);             photourl[index]=flkrimage.getimageurl();             staggeredgridviewitem item = null;             item = new griditem(getactivity(), flkrimage,photourl); //pass 1 image of index             mstaggeredview.additem(item);          }      }      private void showtoast(string msg) {         toast.maketext(getactivity(), msg, toast.length_long).show();     }      private void stopprogress() {         isloading = false;         mlistfooter.setvisibility(view.gone);         mprogress.cancel();     }      // todo: rename , change types of parameters     private string mparam1;     private string mparam2;      private onfragmentinteractionlistener mlistener;      private string mmenuchoice;      public fragmentrecent(string menuchoice) {         // required empty public constructor         mmenuchoice=menuchoice;      }      //private gridviewadapter adapter;     private gridview gridview;     private int columnwidth;     private integer[] photoslist;      /**      * use factory method create new instance of      * fragment using provided parameters.      *      * @param param1 parameter 1.      * @param param2 parameter 2.      * @return new instance of fragment fragmentone.      */        // todo: rename , change types , number of parameters     public static fragmentrecent newinstance(int page) {         fragmentrecent fragment = new fragmentrecent("recentvalue");         bundle args = new bundle();         args.putint("someint", page);         fragment.setarguments(args);         return fragment;     }      @override     public void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);          if(mvolleyqueue==null){             mvolleyqueue= volley.newrequestqueue(getactivity());         }         mvolleyqueue = staggereddemoapplication.getrequestqueue(getactivity());//added         showprogress();         //added async task         //new prefetchdata().execute();          flickergetimagesrequest();     }      private void showprogress() {         mprogress = progressdialog.show(getactivity(), "", "loading...");     }      @override     public view oncreateview(layoutinflater inflater, viewgroup container,                              bundle savedinstancestate) {         // inflate layout fragment         view rootview = inflater.inflate(r.layout.fragment_flickrstart, container, false); //        gridview = (gridview) rootview.findviewbyid(r.id.grid_view); //        gridview.setvisibility(view.visible); //        gridview.setadapter(new gridviewadapter(getactivity()));         mlistfooter = (relativelayout) rootview.findviewbyid(r.id.footer);          mstaggeredview = (staggeredgridview) rootview.findviewbyid(r.id.staggeredview);         // sure before calling initialize haven't initialised xml         //mstaggeredview.initialize(2, staggeredgridview.mode.fixed);         mstaggeredview.setonscrolllistener(scrolllistener);          toast.maketext(getactivity(),mmenuchoice,toast.length_short).show();         return rootview;      }      // todo: rename method, update argument , hook method ui event     public void onbuttonpressed(uri uri) {         if (mlistener != null) {             mlistener.onfragmentinteraction(uri);         }     }      @override     public void onattach(context context) {         super.onattach(context);         if (context instanceof onfragmentinteractionlistener) {             mlistener = (onfragmentinteractionlistener) context;         } else {             throw new runtimeexception(context.tostring()                     + " must implement onfragmentinteractionlistener");         }     }      @override     public void ondetach() {         super.ondetach();         mlistener = null;     }      @override     public void onbackstackchanged() {      }      /**      * interface must implemented activities contain      * fragment allow interaction in fragment communicated      * activity , potentially other fragments contained in      * activity.      * <p/>      * see android training lesson <a href=      * "http://developer.android.com/training/basics/fragments/communicating.html"      * >communicating other fragments</a> more information.      */     public interface onfragmentinteractionlistener {         // todo: update argument type , name         void onfragmentinteraction(uri uri);     }  } 

here code add images griditem

public class griditem extends staggeredgridviewitem {      private context mcontext;     private imageloader mimageloader;     private flickrimage mimage;     private view mview;     private int mheight;     private string[] mphotourl;       public griditem(context context, flickrimage image, string[] photourl) {         mimage = image;         mcontext = context;         mimageloader = staggereddemoapplication.getimageloader();         mphotourl=photourl;     }       @targetapi(build.version_codes.gingerbread)     @override     public view getview(int position, layoutinflater inflater, viewgroup parent) {         // todo auto-generated method stub         mview = inflater.inflate(r.layout.grid_item, null);         final imageview image = (imageview) mview.findviewbyid(r.id.image);          mimageloader.get(mimage.getimageurl(),                 imageloader.getimagelistener(image, r.drawable.bg_no_image, android.r.drawable.ic_dialog_alert), parent.getwidth(), 0);         image.setonclicklistener(new onimageclicklistener(position));//correct position 11,12,13..         return mview;     }      @override     public int getviewheight(layoutinflater inflater, viewgroup parent) {         framelayout item_containerframelayout = (framelayout)mview.findviewbyid(r.id.container);         item_containerframelayout.measure(view.measurespec.unspecified, view.measurespec.unspecified);         mheight = item_containerframelayout.getmeasuredheight();         return mheight;     }      @targetapi(build.version_codes.gingerbread)     private class onimageclicklistener implements view.onclicklistener {         int _position;          public onimageclicklistener(int position) {             this._position = position;         }           @override         public void onclick(view v) {             intent islider = new intent(mcontext, fullscreenimageactivity.class);             islider.putextra("position", _position); //0             islider.putextra("array",mphotourl);//check whether old or new array             islider.putextra("url",mimage.getimageurl());             mcontext.startactivity(islider);         }     } } 

here code image loading

    public class staggereddemoapplication extends application {      private static context applicationcontext;     private static requestqueue mrequestqueue;     private static imageloader mimageloader;     private static bitmaplrucache mbitmapcache;      public static boolean init_flag = true;      public void oncreate() {         super.oncreate();          applicationcontext = this.getapplicationcontext();          mrequestqueue = volley.newrequestqueue(applicationcontext);         long size = runtime.getruntime().maxmemory()/4;         mbitmapcache = new bitmaplrucache(30);//(int)size);         mimageloader = new imageloader(mrequestqueue, mbitmapcache);     }      public static requestqueue getrequestqueue(context mcontext) {         if (mrequestqueue == null) {             mrequestqueue = volley.newrequestqueue(mcontext);         }         return mrequestqueue;     }      public static imageloader getimageloader() {         if (mimageloader != null) {             return mimageloader;         } else {             throw new illegalstateexception("imageloader not initialized");         }     }  } 


Comments

Popular posts from this blog

sql - VB.NET Operand type clash: date is incompatible with int error -

SVG stroke-linecap doesn't work for circles in Firefox? -

python - TypeError: Scalar value for argument 'color' is not numeric in openCV -