2012-12-28 96 views
2

我在Android應用程序的工作,我需要解析的json對象與數據。您如何看待我創建JSONParser類並嘗試使用asynctask,但出現錯誤,我無法理解問題出在哪裏。每次我使用它resultJSON爲空。希望你能給我一個建議!Android上使用的AsyncTask解析JSON

public class JSONParser { 
    private String resultJSON; 

public JSONArray getJSON(String url) throws JSONException { 
    Parser parser = new Parser(); 
    parser.execute(url); 
    return json; 
} 

private class Parser extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     for (String url : urls) { 
      StringBuilder builder = new StringBuilder(); 
      HttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      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)); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         builder.append(line); 
        } 
        resultJSON = builder.toString(); 
       } else { 
        Log.e(JSONParser.class.toString(), "Failed to download file"); 
       } 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return resultJSON; 
    } 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     try { 
      json = new JSONArray(result); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 
+0

什麼是您的日誌說?它應該有一個堆棧跟蹤或「無法下載文件」,因爲'.toString()'不應該從'StringBuilder'中爲空。 – Eric

+0

由於您的JSONArray不會等待異步任務完成,所以您會收到此錯誤。 –

+0

加'onPostExecute'方法的異步任務和移動'JSONArray JSON =新JSONArray(resultJSON)'行那裏。因爲你應該等到任務完成後,現在你試着解析json,當它尚未下載時。 – vorrtex

回答

0

您應該使用的AsyncTask類的get() method檢索任務的結果。它會等待任務完成並獲取結果(這意味着如果將其放在單獨的線程中,並帶有進度對話框或僅包含後臺線程,則最好)。

public JSONArray getJSON(String url) throws JSONException { 
    Parser parser = new Parser(); 
    parser.execute(url); 
    resultJSON = parser.get(); // Probably put this in a Thread to avoid spending too much time waiting for a result on the main thread 
    JSONArray json = new JSONArray(resultJSON); 
    return json; 
} 
1


你爲什麼不JSONArray json = new JSONArray(resultJSON);做這個崗位執行所異步任務的方法。

,我不會建議varevarao方式,因爲它會創建一個線程的額外負擔。

+0

添加onPostExecute方法,但仍有nullPointerException。 – user1107922

+0

是的,它會..試圖理解你得到空指針作爲返回json剛剛調用異步任務後..你有更改你的流代碼在這種方式在後執行你返回...你也可以參考這個鏈接http ://stackoverflow.com/questions/8061571/how-use-progressdialog-and-async-task-get-method-simultaneously –

0

的問題得到解決。這是一個可怕的解決方法,但它的工作原理。添加此行

while(json==null) {} 

調用執行方法後。