我有一個JSON文件(towns.json)坐在我的服務器上,在我的應用程序中,我希望從那裏讀取數據。 所以我想通了,我應該使用AsyncTask不阻止UI線程。我這樣做如下:Android:在AsyncTask中發佈JSON
private class GetTowns extends AsyncTask<String, String, Void> {
protected void onPreExecute() {}
@Override
protected Void doInBackground(String... params) {
String readTown = readFeed(ScreenStart.this, "http://server.com/towns.json");
try {
JSONArray jsonArray = new JSONArray(readTown);
town = new ObjectTown[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
town[i] = new ObjectTown();
town[i].setId(Integer.parseInt(jsonObject.getString("id")));
town[i].setName(jsonObject.getString("name"));
town[i].setLat(Double.parseDouble(jsonObject.getString("latitude")));
town[i].setLon(Double.parseDouble(jsonObject.getString("longitude")));
}
} catch (Exception e) {
Log.i("Catch the exception", e + "");
}
return null;
}
protected void onPostExecute(Void v) {}
}
而且readFeed()函數在這裏:
public static String readFeed(Context context, String str) {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(str);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content, "ISO-8859-1"));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
它的工作原理有時 ...但過一段時間,在doInBackground()拋出此異常:
org.json.JSONException:在字符的輸入0結束......
我究竟做錯了什麼?
問題是,它只有_sometimes_拋出這個錯誤! (服務器上的文件始終可用)。 – user934779 2012-04-18 16:01:29
當錯誤發生時檢查了readTown內容嗎? – marcinj 2012-04-18 16:29:23
有時候,readTown的內容不會返回結果。這是問題。 – user934779 2012-04-18 17:33:38