android - Best practice to pull content from the web? -
i'm new developing android applications, , have little experience java in school. redirected stackoverflow google groups page when looking android beginners group. have question best practice pull content web source , parse it.
firstly, have application threaded (by use of handler?), however, issue class have created (server) connect , fetch content fails retrieve content, causes json parser class (jsonparser) fail, , view display nothing. after navigating previous activity, , attempting call connect(), fetch(), , parse() methods on same remote uri, work.
why (sometimes retrieve remote data) happen sometimes, not always? best practice, including use of progressdialog , internal handler class, make application seamless user. best place ask question? help
here code i'm using now.
import java.io.bufferedinputstream; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstream; import java.net.url; import java.net.urlconnection; import org.apache.http.util.bytearraybuffer; import android.util.log; public class server { public static final string http_protocol = "https://"; public static final string example_net_domain = "example.domain.net/"; private final string api_key = "1234567890"; private static final string api_endpoint = "api.js?"; public final string format = "json"; public string api_version; public string method; public string optional_arguments; public string json; public url jurl; public urlconnection jconnection; public bufferedreader jin; public inputstream = null; /** * @param apiversion * @param method * @param optionalarguments */ public server(string apiversion, string method, string optionalarguments) { super(); api_version = apiversion; method = method; optional_arguments = optionalarguments; connect(); log.i("debug:","connect();"); } /** * @param apiversion * @param method */ public server(string apiversion, string method) { super(); api_version = apiversion; method = method; optional_arguments = ""; connect(); } /** * @param apiversion * @param method */ public void connect(){ try { jurl = new url(http_protocol + example_net_domain + api_endpoint + "api=" + this.api_version + "&method=" + this.method + "&format=" + format + "&apikey=" + api_key + this.optional_arguments); jconnection = jurl.openconnection(); } catch (ioexception e) { log.e("user: ", "error in server connection."); log.e("debug:", "error in server connection"); } log.i("user: ", "connection success!"); } public string fetch() { try { = jconnection.getinputstream(); } catch (ioexception e) { // todo auto-generated catch block log.e("debug:", "fetch-1() error"); } bufferedinputstream bis = new bufferedinputstream(is); bytearraybuffer baf = new bytearraybuffer(50); int current = 0; try { while((current = bis.read()) != -1){ baf.append((byte)current); } log.i("debug:",new string(baf.tobytearray())); } catch (ioexception e) { // todo auto-generated catch block log.e("debug:","fetch() error!"); } /* convert bytes read string. */ log.i("debug:",new string(baf.tobytearray())); return new string(baf.tobytearray()); } /* returns string containing concise, human-readable description of jurl * */ public string showurl() { return jurl.toexternalform(); } }
and code listactivity
/* called when activity starting. initialization should go: calling setcontentview(int) inflate activity's ui, using findviewbyid(int) programmatically interact widgets in ui, calling managedquery(android.net.uri, string[], string, string[], string) retrieve cursors data being displayed, etc. * @see android.app.activity#oncreate() */ @override public void oncreate(bundle savedinstancestate){ super.oncreate(savedinstancestate); log.i("lifecycle: ", "rs.class oncreate()"); server serverconnection = new server(api_version, method, optional_arguments); json = serverconnection.fetch(); jsonparser jparser = new jsonparser(json); groupdata = jparser.parsejsonforrecentshowlist(); simpleadapter adapter = new simpleadapter( this, groupdata, android.r.layout.simple_list_item_2, new string[] { "venue","showdate"}, new int[]{ android.r.id.text2, android.r.id.text1 } ); setlistadapter( adapter ); registerforcontextmenu(getlistview()); }
here json parser class
/** * */ import java.util.arraylist; import java.util.collections; import java.util.hashmap; import java.util.list; import java.util.map; import org.json.jsonarray; import org.json.jsonexception; import org.json.jsonobject; import android.util.log; /** * @author * */ public class jsonparser { public list<map<string, string>> groupdata = new arraylist<map<string, string>>(); private string jstring; private map<string, string> group; private jsonarray jarray; private string setlistdata; public string notesstring = ""; public string[] splitsetsarray; public string[] splitencorearray; public string[] extrawork; public string[] notesarray; public string pvenue_text; public string pcity_text; public string pstate_text; public string pcountry_text; public string pdate_text; public string pset1_text; public string pset2_text; public string pset3_text; public string pencore1_text; public string pencore2_text; public string pnotes_text; public int totalnumberofsets; public int totalnumberofencores; public int totalnumberofnotes; public jsonobject jobject; public jsonparser(string json) { // todo auto-generated constructor stub jstring = json; } /** * @return */ public list<map<string, string>> parsejsonforrecentshowlist(){ try { jarray = new jsonarray(jstring); for(int i=0;i<jarray.length();i++) { jobject = jarray.getjsonobject(i); group = new hashmap<string, string>(); group.put("showdate", jobject.getstring("showdate")); group.put("venue", jobject.getstring("venue")); groupdata.add(group); } } catch (jsonexception e) { log.e("debug: ", "json parse error!"); } return groupdata; } /** * */ public void parsejsonforsetlistdata(){ if(jstring != null){ try { jarray = new jsonarray(jstring); jobject = jarray.getjsonobject(0); pvenue_text = jobject.getstring("venue") ; pcity_text = jobject.getstring("city") + ", " ; pstate_text = jobject.getstring("state") + ", " ; pcountry_text = jobject.getstring("country") ; pdate_text = jobject.getstring("nicedate") ; setlistdata = nohtml(jobject.getstring("setlistdata")); splitsetsarray = setlistdata.split("set..:."); totalnumberofsets = splitsetsarray.length-1; string[] splitencorearray = splitsetsarray[splitsetsarray.length-1].split("encore:."); totalnumberofencores = splitencorearray.length-1; splitsetsarray[splitsetsarray.length-1] = splitencorearray[0]; splitencorearray[0] = ""; extrawork = splitencorearray[splitencorearray.length-1].split("\\[1\\]"); notesarray = extrawork[extrawork.length-1].split("\\[.\\]"); totalnumberofnotes = notesarray.length-1; splitencorearray[splitencorearray.length-1] = extrawork[0]; //notesarray[0] = ""; for(int i=0;i<notesarray.length;i++){ int number = i+1; notesstring += "["+number+"] "+notesarray[i] + "\n"; } if(totalnumberofsets != 0) { pset1_text = "set 1: " + splitsetsarray[1]; if (totalnumberofsets > 1){ pset2_text = "set 2: " + splitsetsarray[2]; } else { pset2_text = ""; } if (totalnumberofsets > 2){ pset3_text = "set 3: " + splitsetsarray[3]; } else { pset3_text = ""; } } pencore1_text = "encore: " + splitencorearray[1]; if (totalnumberofencores > 1) { pencore2_text = "encore 2: " + splitencorearray[2]; } else { pencore2_text = ""; } pnotes_text = notesstring; log.e("debug: ", "json parsed!"); } catch (jsonexception e) { log.e("error:","caught json exception @ parseforsetlistdata()"); } } else { log.e("error:", "jstring = null"); pvenue_text = "i'm sorry, setlist data not retrieved server. please try again."; } } public void parsejsonforreviews(){ try { jarray = new jsonarray(jstring); for(int i=0;i<jarray.length();i++){ jobject = jarray.getjsonobject(i); group = new hashmap<string, string>(); group.put("author", jobject.getstring("author")); group.put("review", jobject.getstring("review")); groupdata.add(group); } } catch (jsonexception e) { log.e("debug: ", "json reviews parse error!"); } } public list<map<string, string>> parsejsonforyears(){ try { jarray = new jsonarray(jstring); for(int i=0;i<jarray.length();i++){ jsonobject jobject = jarray.getjsonobject(i); group = new hashmap<string, string>(); group.put("showdate", jobject.getstring("showdate")); group.put("venue", jobject.getstring("venue")); groupdata.add(group); } } catch (jsonexception e) { log.e("debug: ", "json years parse error!"); } collections.reverse(groupdata); return groupdata; } public string nohtml(string json){ return json.tostring().replaceall("\\<.*?>", ""); } }
well, without error logs it's difficult guess might issue.
however, might have better luck if used androidhttpclient connection. job of recovering/retrying.
also, regarding multi-threading, asynctask starting place.
my shortcutlink application, available on github, might give heads on how use these.
edit
you might try converting inputstream directly string using following code java2s.com.
public static string convertstreamtostring(inputstream is) throws exception { bufferedreader reader = new bufferedreader(new inputstreamreader(is)); stringbuilder sb = new stringbuilder(); string line = null; while ((line = reader.readline()) != null) { sb.append(line + "\n"); } is.close(); return sb.tostring(); }
Comments
Post a Comment