2013-08-21 5 views
0

Я пытаюсь выполнить простой JSON-анализ для получения данных из URL-адреса и изменения некоторых значений на экране. В настоящее время, однако, приложение блокируется при нажатии кнопки и в конечном итоге сбой. Я потянув данные изОшибка/сбой при использовании Android

http://dev4.vcsonline.com/deding/vpmi_mobile/WebAPI/WebAPI/api/address

OnClick слушателем и асинхронная задача:

Pull_Data = (Button) findViewById(R.id.Pull_Data); 
    Pull_Data.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View v) { 
      new MyAsyncTask().execute(URL); 

     } 


    }); 


private class MyAsyncTask extends AsyncTask<String, String, String>{ 
    protected String doInBackground(String... args) { 
     SetValues(args[0]); 
     return null; 
    } 

JSON код тянуть/манипуляции:

public static JSONObject getJSONfromURL(String url){ 

    //initialize 
    InputStream is = null; 
    String result = ""; 
    JSONObject JArray = null; 

    //http post 
    try{ 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(url); 
     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(); 
     //client_Address1.setText(result); 
    }catch(Exception e){ 
     Log.e("log_tag", "Error converting result " + e.toString()); 
    } 


    // try parse the string to a JSON object 

    try{ 
      JArray = new JSONObject(result); 
    }catch(JSONException e){ 
     Log.e("log_tag", "Error parsing data " + e.toString()); 
    } 
    return JArray; 
} 

public void SetValues(String url){ 
    JSONObject json = getJSONfromURL(url); 

    // get the element that holds the addresses 
    try{ 
     JSONArray addresses = json.getJSONArray("Address"); 

     // get the proper items 
     JSONObject e = addresses.getJSONObject(0); 
     client_Address1.setText(e.getString("addressLineOne")); 
     client_Address2.setText(e.getString("addressLineTwo")); 
     client_Address3.setText(e.getString("addressCity") + ", " + e.getString("addressState") + " " + e.getString("addressZip")); 
     client_Id.setText(e.getString("clientID")); 
    }catch(JSONException e){ 
    Log.e("log_tag", "Error parsing data " + e.toString()); 
    } 
} 

Наконец, записи LogCat:

08-21 11:49:42.860: E/log_tag(30551): Error converting result java.lang.NullPointerException 
08-21 11:49:42.860: E/log_tag(30551): Error parsing data org.json.JSONException: End of input at character 0 of 
08-21 11:49:42.865: W/dalvikvm(30551): threadid=12: thread exiting with uncaught exception (group=0x40c101f8) 
08-21 11:49:42.870: E/AndroidRuntime(30551): FATAL EXCEPTION: AsyncTask #1 
08-21 11:49:42.870: E/AndroidRuntime(30551): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-21 11:49:42.870: E/AndroidRuntime(30551): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.lang.Thread.run(Thread.java:856) 
08-21 11:49:42.870: E/AndroidRuntime(30551): Caused by: java.lang.NullPointerException 
08-21 11:49:42.870: E/AndroidRuntime(30551): at com.example.networking.MainActivity.SetValues(MainActivity.java:353) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at com.example.networking.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:222) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at com.example.networking.MainActivity$MyAsyncTask.doInBackground(MainActivity.java:1) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
08-21 11:49:42.870: E/AndroidRuntime(30551): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
08-21 11:49:42.870: E/AndroidRuntime(30551): ... 5 more 
+0

ссылка содержит данные XML. –

+0

у него есть оба, android потянул его обратно как json, так же, как Internet Explorer и Firefox. Chrome отбрасывает xml –

+0

Да, это xml-данные, а не json-формат – Xenione

ответ

2

Используя инструмент Opera Dragonfly, чтобы сделать запрос HTTP POST для данной ссылки (без вывешенных данных):

Запрос:

POST /deding/vpmi_mobile/WebAPI/WebAPI/api/address HTTP/1.1 
Host: dev4.vcsonline.com 
Content-Length: 0 

Это ответ я получаю обратно:

HTTP/1.1 204 No Content 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Sun, 25 Aug 2013 17:18:51 GMT 

Примечание No Content. Похоже, ваш веб-сервис не принимает запросы POST?

+0

Я не кодировал сайт, поэтому не уверен. Есть ли способ перекодировать вышеупомянутое, чтобы заставить его использовать GET isntead POST –

+0

Ну, в вашем коде я вижу эту строку: «HttpPost httppost = new HttpPost (url);'. Не знакомы с API от верхней части моей головы, но я бы проверить это, чтобы посмотреть, есть ли версия «Получить». – Jrop

+0

Кажется, что 'GET' и никаких других заголовков он не возвращает JSON. Вы можете управлять возвращаемым типом данных, который кажется с этими заголовками: 'Accept: application/json' или' Accept: text/xml' – Jrop

0

 new MyAsyncTask().execute(URL); 

представляется рискованным для меня. Поскольку вы не создаете ссылку на новый экземпляр MyAsyncTask, возможно, что он получает сбор мусора. Попробуйте присвоить его переменной-члену:

 mAsyncTask = new MyAsyncTask(); 
     mAsyncTask.execute(URL); 

где mAsyncTask является участником вашей деятельности.

Это изменение может или не может устранить эту проблему, но это может помешать другим.

+0

Ух, я использовал 'AsyncTask', не сохраняя ссылки на него, и он работал нормально. :) –

+0

GC капризно. Если вы не найдете что-то, что гарантирует, что объект AsyncTask не будет GC'd во время его работы, даже если приложение не поддерживает ссылку на него, я бы рассматривал это как возможный режим отказа. Не гарантируется никакими средствами, но возможно. –

+0

@ DanBreslau Я не думаю, что здесь проблема – Raghunandan

0

Вы используете setValues(), который обновляет элементы управления пользовательского интерфейса в методе doInBackground, который не работает в потоке пользовательского интерфейса.

Вместо этого переместите его на onPostExecute(), который работает по потоку пользовательского интерфейса. Под этим я подразумеваю обновление элементов управления пользовательского интерфейса. Вы должны сделать всю сеть и любую обработку времени, в doInBackground

Дайте мне знать, если это сработало.

+1

, в этом случае вы должны получить исключение, вызванное из неправильного потока. да, вы правы, op устанавливает текстовый вид в doInbackground. это одна ошибка – Raghunandan

+0

Несколько вопросов здесь: как 'Jrop' показал, никаких данных. Тогда вопрос, который я указал. :-) –

0

У меня была такая же проблема, и после того, как я понял, что проблема была в ссылке HttpPost. Итак, я изменил ее в HttpGet, и моя проблема решена.

попробуйте этот код:

public static JSONObject getJSONfromURL(String url){ 
//initialize 
InputStream is = null; 
String result = ""; 
JSONObject JArray = null; 

//http post 
try{ 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 
    HttpResponse response = httpclient.execute(httpget); 
    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(); 
    //client_Address1.setText(result); 
}catch(Exception e){ 
    Log.e("log_tag", "Error converting result " + e.toString()); 
} 


// try parse the string to a JSON object 

try{ 
     JArray = new JSONObject(result); 
}catch(JSONException e){ 
    Log.e("log_tag", "Error parsing data " + e.toString()); 
} 
return JArray; 
} 


public void SetValues(String url){ 
JSONObject json = getJSONfromURL(url); 

// get the element that holds the addresses 
try{ 
    JSONArray addresses = json.getJSONArray("Address"); 

    // get the proper items 
    JSONObject e = addresses.getJSONObject(0); 
    client_Address1.setText(e.getString("addressLineOne")); 
    client_Address2.setText(e.getString("addressLineTwo")); 
    client_Address3.setText(e.getString("addressCity") + ", " + e.getString("addressState") + " " + e.getString("addressZip")); 
    client_Id.setText(e.getString("clientID")); 
}catch(JSONException e){ 
Log.e("log_tag", "Error parsing data " + e.toString()); 
} 
} 
+0

попробовал это, все равно попал в аварию. Я также пытаюсь идти по строкам в отладчике и не получаю никакой полезной информации или ошибок. Довольно неприятно. –

Смежные вопросы