2014-03-06 137 views
0

我有一個對象,與一個detailsURL字符串聯繫。在那個網址是一些JSON,有更多關於我需要設置的聯繫信息。我試圖做到這一點的AsyncTask的方法是這樣的:Android - 如何正確設置AsyncTask從URL中獲取JSON數據?

class detailDownloader extends AsyncTask<String, Void, Void> { 
     String detail; 
     private contact c; 

     public detailDownloader(String detail, contact c) { 
      this.c = c; 
      this.detail = detail; 
     } 

     protected Void doInBackground(String... urls) { 
      String url = urls[0]; 
      Log.d("contact", "1"); 
      String s; 
      try { 
      InputStream in = new java.net.URL(url).openStream(); 
       Log.d("contact", "2"); 
      BufferedReader br2 = null; 
      br2 = new BufferedReader(new InputStreamReader(in, "UTF-8")); 
      StringBuilder sb2 = new StringBuilder(); 
       Log.d("contact", "3"); 
      while((s = br2.readLine()) != null) { 
       sb2.append(s); 
      } 
      s = sb2.toString(); 
      JSONArray detail = new JSONArray(s); 
      for(int j = 0; j < detail.length(); j++){ 
       JSONObject obj2 = detail.getJSONObject(j); 
       boolean favorite = obj2.getBoolean("favorite"); 
       String email = obj2.getString("email"); 
       String largeURL = obj2.getString("largeImageURL"); 
       JSONObject address = obj2.getJSONObject("address"); 
       String street = address.getString("street"); 
       String city = address.getString("city"); 
       String state = address.getString("state"); 
       c.setFavorite(favorite); 
       c.setLargeURL(largeURL); 
       c.setEmail(email); 
       c.setStreet(street); 
       c.setCityState(city + ", " + state); 
      } 
      in.close(); 
      } catch (Exception e) { 
       Log.e("Error", e.getMessage()); 
      } 
     return null; 
     } 
} 

的detailDownloader被稱爲: new detailDownloader(c.getDetailsURL(), c).execute();

但我得到我的日誌響應:"03-06 16:30:24.724: I/Choreographer(29237): Skipped 370 frames! The application may be doing too much work on its main thread."

任何想法如何解決這個問題?

回答

0

這段代碼乍一看對我來說很合適。你確定這是導致跳幀的類嗎?你確定你沒有在導致這個問題的主線程上做其他事嗎?

貴detailsDownloader類實現onPreExecute或onPostExecute?如果是這樣,你也應該發佈你的代碼。

0

這種類型的錯誤通常是通過使用過多UI threads,檢查this更多信息所致。