我有一个JSON文件(towns.json)坐在我的服务器上,在我的应用程序中,我希望从那里读取数据。 所以我想我应该使用AsyncTask来阻止UI线程。我这样做:
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
我究竟做错了什么?
答案 0 :(得分:1)
看起来服务器没有返回数据,你检查过你的字符串是非空的吗?要将HttpEntity转换为字符串,您可以使用:
String jsonStr = EntityUtils.toString(httpEntity);
我想你也应该在使用它之前检查实体是否与null不同。
答案 1 :(得分:1)
使用AsyncTasks发送REST请求不是一个好主意。 AsyncTasks不应用于网络等长时间运行的操作。实际上,AsyncTask有两个相关的主要问题:
在RoboSpice Motivations应用程序(available on Google Play)中,我们深入了解AsyncTasks,Loaders,它们在网络方面的特性和缺点,并向您介绍另一种解决方案:RoboSpice
我们甚至提供了an infographics来解释这个问题。用几句话说出来
我鼓励您下载RoboSpice Motivations app,它确实深入地解释了这一点,并提供了进行某些后台操作的不同方法的示例和演示。