display a listView using Activity(not ListActivity) and asyncTask onPostExecute() android -
when run application crashes. noticed problem appears when write list.setadapter(adapter); in postexecute(). can me? thanks.
in searchbykey activity user can choose items list
public class searchbykey extends sherlockactivity { actionbar actionbar; listview listview; arrayadapter<string> adapter; double latitude, longitude; public static arraylist<hashmap<string, string>> xml_results; public progressdialog progressdialog; intent intentresults ; int k=0; //xml node keys static final string key_env = "environment"; // parent node static final string key_title = "title"; static final string key_feed = "feed"; static final string key_id = "id"; static final string key_lat = "lat"; static final string key_lon = "lon"; static final string key_dif_lat = "dif lat"; static final string key_dif_lon = "dif lon"; static final string key_name = "name"; static final string key_desc = "description"; string[] countries = new string[] { "india", "pakistan", "sri lanka", "china", "bangladesh", "nepal", "afghanistan", "north korea", "south korea", "japan" }; /** called when activity first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.keylist); actionbar=getsupportactionbar(); actionbar.settitle("search keyword(s)"); //-------get location calculate previus acrivity. before activity start. bundle extras = getintent().getextras(); if (extras == null) { system.out.println("none"); } //get data via key latitude = extras.getdouble("latitude"); longitude = extras.getdouble("longitude"); //----------i have location service detect location , send broadcast msg. here declare register listen broadcast msg location intentfilter filter = new intentfilter("xxx.yyy.intent.action.location"); this.registerreceiver(new locationreceiver(), filter); //the checkbox each item specified layout android.r.layout.simple_list_item_multiple_choice arrayadapter<string> adapter = new arrayadapter<string>(this, android.r.layout.simple_list_item_multiple_choice, countries); //getting reference listview object of layout listview = (listview) findviewbyid(r.id.listview); //setting adapter listview listview.setadapter(adapter); } @override public boolean oncreateoptionsmenu(menu menu) { getsupportmenuinflater().inflate(r.menu.keywordmenu, menu); (menu.finditem(r.id.search)).seticon(r.drawable.action_search); (menu.finditem(r.id.clear)).seticon(r.drawable.abs__ic_clear); //return(true); return super.oncreateoptionsmenu(menu); } public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case r.id.search: //-----------call new activity appears search result intentresults = new intent (this, keysearch_results.class); startactivity(intentresults); break; case r.id.clear: clearselections(); break; } return true; } } //-----the keysearch_results activity want take info url (xml parser) , appear result of search public class keysearch_results extends sherlockactivity { //xml node keys static final string key_env = "environment"; // parent node static final string key_title = "title"; static final string key_feed = "feed"; static final string key_id = "id"; static final string key_lat = "lat"; static final string key_lon = "lon"; static final string key_dif_lat = "dif lat"; static final string key_dif_lon = "dif lon"; static final string key_name = "name"; static final string key_desc = "description"; public progressdialog progressdialog; public arraylist<hashmap<string, string>> listitems; //menu bar actionbar actionbar; //list listview listview; arrayadapter<string> adapter; //user location double latitude, longitude; /** called when activity first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.results); //appear action bar actionbar=getsupportactionbar(); actionbar.settitle("results"); //getting reference listview object of layout listview = (listview) findviewbyid(r.id.reslist); listadapter adapter = new simpleadapter(this, listitems, r.layout.result_row, new string[] { "feed", "dif lat",}, new int[] { r.id.name, r.id.dif}); new yourdownload().execute(); } private class yourdownload extends asynctask<void, void, integer> { // private string content; @override protected integer doinbackground(void... params) { if(isonline()){ listitems.clear(); int i; hashmap<string, string> map = null; xmlparser parser = new xmlparser(); //getting xml string xml = null ; defaulthttpclient client = new defaulthttpclient(); httpget request = new httpget(); try { request.seturi(new uri("http://api.cosm.com/v2/feeds.xml?&key=sov51taorgtao6w_junodpn3kmqsakxuzjfsblr3tup4tt0g&lat=35.1446170529352&lon=33.3462524414062")); } catch (urisyntaxexception e) { e.printstacktrace(); system.out.print("http\n"); } httpresponse httpresponse = null; try { httpresponse = client.execute(request); } catch (clientprotocolexception e1) { e1.printstacktrace(); } catch (ioexception e1) { e1.printstacktrace(); } httpentity httpentity = httpresponse.getentity(); try { xml = entityutils.tostring(httpentity); } catch (parseexception e1) { e1.printstacktrace(); } catch (ioexception e1) { e1.printstacktrace(); } //getting dom element document doc = parser.getdomelement(xml); nodelist nl = doc.getelementsbytagname(key_env); //int size=nl.getlength(); // looping through item nodes <item> (i = 0; < nl.getlength(); i++) { // creating new hashmap map = new hashmap<string, string>(); element e = (element) nl.item(i); // adding each child node hashmap key => value map.put(key_feed, parser.getvalue(e, key_feed)); map.put(key_dif_lat, parser.getvalue(e, key_lat)); map.put(key_dif_lon, parser.getvalue(e, key_lon)); listitems.add(map); } } else{ toast.maketext(keysearch_results.this, "no connection..", toast.length_long).show(); } return 1; } @override protected void onpostexecute(integer result) { if(result==1 && listitems!=null) { listview.setadapter(adapter); } progressdialog.dismiss(); super.onpostexecute(result); } } } list layout:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <textview android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textappearance="?android:attr/textappearancemedium" android:textstyle="bold" android:textsize="16sp" > </textview> <textview android:id="@+id/dif" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textappearance="?android:attr/textappearancemedium" android:textstyle="bold" android:textsize="16sp" > </textview> <textview android:id="@+id/dd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:textappearance="?android:attr/textappearancemedium" android:textstyle="bold" android:textsize="16sp" > </textview> </linearlayout> errors:
04-06 19:50:30.326: e/activitythread(795): activity com.example.ioaaan.searchbykey has leaked intentreceiver com.example.ioaaan.searchbykey$locationreceiver@40cdb248 registered here. missing call unregisterreceiver()? 04-06 19:50:30.326: e/activitythread(795): android.app.intentreceiverleaked: activity com.example.ioaaan.searchbykey has leaked intentreceiver com.example.ioaaan.searchbykey$locationreceiver@40cdb248 registered here. missing call unregisterreceiver()? 04-06 19:50:30.326: e/activitythread(795): @ android.app.loadedapk$receiverdispatcher.<init>(loadedapk.java:795) 04-06 19:50:30.326: e/activitythread(795): @ android.app.loadedapk.getreceiverdispatcher(loadedapk.java:596) 04-06 19:50:30.326: e/activitythread(795): @ android.app.contextimpl.registerreceiverinternal(contextimpl.java:1316) 04-06 19:50:30.326: e/activitythread(795): @ android.app.contextimpl.registerreceiver(contextimpl.java:1296) 04-06 19:50:30.326: e/activitythread(795): @ android.app.contextimpl.registerreceiver(contextimpl.java:1290) 04-06 19:50:30.326: e/activitythread(795): @ android.content.contextwrapper.registerreceiver(contextwrapper.java:423) 04-06 19:50:30.326: e/activitythread(795): @ com.example.ioaaan.searchbykey.oncreate(searchbykey.java:121) 04-06 19:50:30.326: e/activitythread(795): @ android.app.activity.performcreate(activity.java:5104) 04-06 19:50:30.326: e/activitythread(795): @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1080) 04-06 19:50:30.326: e/activitythread(795): @ android.app.activitythread.performlaunchactivity(activitythread.java:2144) 04-06 19:50:30.326: e/activitythread(795): @ android.app.activitythread.handlelaunchactivity(activitythread.java:2230) 04-06 19:50:30.326: e/activitythread(795): @ android.app.activitythread.access$600(activitythread.java:141) 04-06 19:50:30.326: e/activitythread(795): @ android.app.activitythread$h.handlemessage(activitythread.java:1234) 04-06 19:50:30.326: e/activitythread(795): @ android.os.handler.dispatchmessage(handler.java:99) 04-06 19:50:30.326: e/activitythread(795): @ android.os.looper.loop(looper.java:137) 04-06 19:50:30.326: e/activitythread(795): @ android.app.activitythread.main(activitythread.java:5041) 04-06 19:50:30.326: e/activitythread(795): @ java.lang.reflect.method.invokenative(native method) 04-06 19:50:30.326: e/activitythread(795): @ java.lang.reflect.method.invoke(method.java:511) 04-06 19:50:30.326: e/activitythread(795): @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:793) 04-06 19:50:30.326: e/activitythread(795): @ com.android.internal.os.zygoteinit.main(zygoteinit.java:560) 04-06 19:50:30.326: e/activitythread(795): @ dalvik.system.nativestart.main(native method) sorry errors new in android application , can not understand how fix errors
to register , unregister broadcastreceiver try this:
1.
//declare global in class. private locationreceiver locationreceiver = new locationreceiver(); then in oncreate()
intentfilter filter = new intentfilter("xxx.yyy.intent.action.location"); this.registerreceiver(locationreceiver, filter); then in ondestroy() unregister locationreceiver this:
@override protected void ondestroy() { if (locationreceiver != null) { locationreceiver.cancel(true); } try { unregisterreceiver(locationreceiver); } catch (exception e) { log.e("unregister receiver error", "> " + e.getmessage()); } super.ondestroy(); } 2. if doesn't delete locationreceiver class , declare bellow variable, work same locationreceiver:
private final broadcastreceiver locationreceiver = new broadcastreceiver() { @override public void onreceive(context context, intent calledintent) log.d("loc_receiver", "location received!"); latitude = calledintent.getdoubleextra("latitude", -1); longitude = calledintent.getdoubleextra("longitude", -1); } }; then in oncreate(), register locationreceiver this:
intentfilter filter = new intentfilter("xxx.yyy.intent.action.location"); this.registerreceiver(locationreceiver, filter); then in ondestroy() unregister locationreceiver this:
@override protected void ondestroy() { if (locationreceiver != null) { locationreceiver.cancel(true); } try { unregisterreceiver(locationreceiver); } catch (exception e) { log.e("unregister receiver error", "> " + e.getmessage()); } super.ondestroy(); } hope help. way, have used 2nd approach in project.
Comments
Post a Comment