json - android - AsyncTask not reaching onPostExecute() - "The application may be doing too much in its main thread" -
i have fragment in want parse json , create arraylist of attributes , put arraylist's data spinner. however, not know if doing asynctask should. everytime try new way parse json url in fragment activity either app crashes "unfortunately, app has stopped" message or spinner stays empty. verified logs never reach onpostexecute() method on asynctask. questions: - doing wrong? - should using asynctask?
my code:
private class loadresources extends asynctask<string, void, string> { @override protected void onpreexecute() { super.onpreexecute(); log.v(tag, "pre-execute"); } // call after onpreexecute method @override protected string doinbackground(string... urls) { log.v(tag, "background"); log.v(tag, urls[0]); (int = 0; < 5; i++) { try { thread.sleep(1000); } catch (interruptedexception e) { thread.interrupted(); } } try { url u = new url(urls[0]); bufferedreader in = new bufferedreader(new inputstreamreader(u.openstream(), charset.forname("utf-8"))); stringbuilder sb = new stringbuilder(); string line; while ((line = in.readline()) != null) { sb.append(line); } // above parsing works, i've tested jsonparser parser = new jsonparser(); jsonelement elem = parser.parse(sb.tostring()); jsonarray array = elem.getasjsonarray(); (int = 0; < array.size(); i++) { jsonelement elem1 = array.get(i); jsonarray tmparr = elem1.getasjsonarray(); (jsonelement elem2 : tmparr) { elem2.getasjsonobject().getasjsonprimitive().getasstring()); myarraylist.add(elem2.getasjsonobject().getasjsonprimitive("name").tostring()); return urls[0]; } protected void onpostexecute(string params) { log.v(tag, params); } } on oncreateview:
loadresources loader = new loadresources(); loader.execute("http://localhost:5000/avalidpath); text = (autocompletetextview) rootview.findviewbyid(r.id.nomealuno); final arrayadapter<string> adapter = new arrayadapter<string>(getactivity().getapplicationcontext(), android.r.layout.simple_spinner_dropdown_item, myarraylist); text.setadapter(adapter); text.setthreshold(3); right app stops working when swipe fragment. in advance, guys.
actually should heavy work in doinbckground method.
onpostexecute(result), invoked on ui thread after background computation finishes. result of background computation passed step parameter. doc here
edit:
class loadresources extends asynctask<string, void, arraylist<string>> { context context; public loadresources(context context) { this.context = context; } @override protected string doinbackground(string... urls) { ... return myarraylist; } protected void onpostexecute(arraylist<string> params) { ((youractivity)context).setmyadapter(params); } } in activity (fragment or whatever) :
public void setmyadapter(arraylist<string> params) { final arrayadapter<string> adapter = new arrayadapter<string>(getactivity().getapplicationcontext(), android.r.layout.simple_spinner_dropdown_item, myarraylist); text.setadapter(adapter); }
Comments
Post a Comment