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
Post a Comment