Android 获取JSON对象有时会使应用程序崩溃
这是我获取JSON数组的代码:Android 获取JSON对象有时会使应用程序崩溃,android,Android,这是我获取JSON数组的代码: public void download_vse_igralce(View view) { mylist.clear(); //sem dal v oklepaje String result = ""; //the year data to send ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
public void download_vse_igralce(View view)
{
mylist.clear(); //sem dal v oklepaje
String result = "";
//the year data to send
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("year","1980"));
InputStream is = null;
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://gregor-apps.com/ubs/pokazi_vse_igralce.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//parse json data
try{
{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
Log.i("log_tag","id: "+json_data.getInt("id")+
", ime: "+json_data.getString("ime")+
", priimek: "+json_data.getString("priimek")+
", pozicija: "+json_data.getString("pozicija")
);
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", json_data.getString("id"));
map.put("firstname", json_data.getString("ime"));
map.put("lastname", json_data.getString("priimek"));
map.put("position", json_data.getString("pozicija"));
map.put("height", json_data.getString("height"));
map.put("weight", json_data.getString("weight"));
map.put("hometown", json_data.getString("hometown"));
map.put("birthdate", json_data.getString("birthdate"));
map.put("jersey", json_data.getString("number"));
map.put("picture", json_data.getString("slika"));
mylist.add(map);
}
downloadani_igralci=1;
}
}catch(JSONException e){
downloadani_igralci=0;
Log.e("log_tag", "Error parsing data "+e.toString());
}
settings(view);
}
public void下载(查看)
{
mylist.clear();//sem dal v oklepaje
字符串结果=”;
//要发送的年度数据
ArrayList nameValuePairs=新的ArrayList();
nameValuePairs.add(新的基本nameValuePairs(“年份”,“1980”));
InputStream=null;
//http post
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://gregor-apps.com/ubs/pokazi_vse_igralce.php");
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
is=entity.getContent();
}捕获(例外e){
e(“Log_标记”,“http连接错误”+e.toString());
}
//将响应转换为字符串
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“iso-8859-1”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
is.close();
结果=sb.toString();
}捕获(例外e){
Log.e(“Log_标记”,“错误转换结果”+e.toString());
}
//解析json数据
试一试{
{
JSONArray jArray=新JSONArray(结果);
对于(int i=0;i我认为主要的问题是您有三个独立的try/catch块,但是一旦您实际捕获到一个异常,您不会停止处理。例如,您首先执行一个POST,如果失败,您仍然会尝试读取输出。相反,您应该在catch块中return;
,以便停止处理
AsyncTasks也很好,从4.0开始是必需的,但不是问题的解决方案。您也应该对此进行研究。类似以下内容:
public void download_vse_igralce(View view){
mylist.clear();
JSONParserTask task = new JSONParserTask();
task.execute();
}
private class JSONParserTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground( Void... ignoredParams ) {
String result = "";
//the year data to send
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("year","1980"));
InputStream is = null;
//http post
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://gregor-apps.com/ubs/pokazi_vse_igralce.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//parse json data
try{
{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
Log.i("log_tag","id: "+json_data.getInt("id")+
", ime: "+json_data.getString("ime")+
", priimek: "+json_data.getString("priimek")+
", pozicija: "+json_data.getString("pozicija")
);
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", json_data.getString("id"));
map.put("firstname", json_data.getString("ime"));
map.put("lastname", json_data.getString("priimek"));
map.put("position", json_data.getString("pozicija"));
map.put("height", json_data.getString("height"));
map.put("weight", json_data.getString("weight"));
map.put("hometown", json_data.getString("hometown"));
map.put("birthdate", json_data.getString("birthdate"));
map.put("jersey", json_data.getString("number"));
map.put("picture", json_data.getString("slika"));
mylist.add(map);
}
downloadani_igralci=1;
}
}catch(JSONException e){
downloadani_igralci=0;
Log.e("log_tag", "Error parsing data "+e.toString());
}
}
protected void onPostExecute( Void array ) {
settings(view);
}
}
public void下载(查看){
mylist.clear();
JSONParserTask=新的JSONParserTask();
task.execute();
}
私有类JSONParserTask扩展了AsyncTask{
受保护的Void doInBackground(Void…ignoredParams){
字符串结果=”;
//要发送的年度数据
ArrayList nameValuePairs=新的ArrayList();
nameValuePairs.add(新的基本nameValuePairs(“年份”,“1980”));
InputStream=null;
//http post
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://gregor-apps.com/ubs/pokazi_vse_igralce.php");
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
is=entity.getContent();
}捕获(例外e){
e(“Log_标记”,“http连接错误”+e.toString());
}
//将响应转换为字符串
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“iso-8859-1”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
is.close();
结果=sb.toString();
}捕获(例外e){
Log.e(“Log_标记”,“错误转换结果”+e.toString());
}
//解析json数据
试一试{
{
JSONArray jArray=新JSONArray(结果);
对于(int i=0;i我认为这可能是因为internet连接。有时您的应用程序无法正确下载JSON内容,因此当它尝试解析时,将进入错误状态,而您的应用程序崩溃是因为try-catch的风格不正确“尽管连接良好,但asynchTask无法解决无法访问的网络的问题。”
您可以通过添加以下内容来修复此问题:
httpclient.getConnectionManager().shutdown();
这将解决“保持活动”连接的问题。您不应该在UI线程上执行网络请求。搜索AsyncTask。实际上,Try/catch块无关紧要。长操作(网络请求)在UI线程上是导致应用程序停止响应的原因。不需要异步任务。从3.0开始,需要在UI线程下执行网络操作。三个独立的try/catch块有什么区别吗?我认为它只能防止应用程序崩溃(例如,如果第一个不起作用,那么其他两个也不起作用-但它不会使应用程序崩溃)。感谢您对我的问题做出如此快速的回答-我对这些东西是新手…@BojanRadivojevicBomber在问题中,他说应用程序“停止”而不是“停止响应”(获得ANR)。但是,是的,它也会阻止UI。Gregor:也许你应该研究一下try/catch是如何工作的。是的,它阻止了崩溃的发生,但逻辑流将继续。它也会影响你捕获的内容(例如,在上一次捕获中,你只捕获了JSON异常,而不是空指针异常),这是一个冗长的主题。在这种情况下,整个代码应该包装在一个try/catch异常中,以防止“流氓”异常使代码崩溃。@dmon但在他对问题的描述中,他说:“……应用程序停止反应。。。“,这意味着-ANRasynchTask无法解决无法访问的网络的问题,即使连接良好。访问著名的谷歌地理编码器服务时,我不时会遇到异常