2013-01-05 28 views
1

所以我有一個問題,爲什麼我的功能getIt()休息在httpGet並給出Exception,在清單我加INTERNET權限!我不使用的AsyncTask,因爲我需要創建一個新的類,如果我打電話的AsyncTask與get它擋住了我的UIAndroid加載一些數據

Class.java

public class loadMovies{ 
    public String getIt(){ 
     InputStream ips = null; 
     JSONObject json = null; 
     String get = ""; 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet("http://mysite/app/movies"); 
     try { 
      HttpResponse response = client.execute(httpGet); 
      ips = response.getEntity().getContent(); 

      BufferedReader buffer = new BufferedReader(new InputStreamReader(ips)); 
      StringBuilder builder = new StringBuilder(); 
      String line; 

      while((line = buffer.readLine()) != null){ 
       builder.append(line+"\n"); 
      } 
      json = new JSONObject(builder.toString()); 
      Log.d(TAG, json.toString()); 
     } 
     catch(Exception e){ e.printStackTrace(); } 

     if(json != null){ 
      JSONArray array = json.optJSONObject("data").optJSONArray("movies"); 

      for(int i = 0; i < array.length(); i++){ 
       JSONObject rss = array.optJSONObject(i); 
       get += rss.optString("name")+"\n"; 
      } 
     } 
     return get; 
    }  
} 
+0

是否添加了錯誤日誌/ logcat?它給了什麼樣的例外? – Siebe

+0

01-05 21:08:38.192:D/Afisha(29030):android.os.NetworkOnMainThreadException –

+0

你能清楚嗎? – Kanth

回答

0

如果我叫的AsyncTask使用get它擋住了我的UI

因爲醫生說大約AsyncTask get()

如果需要等待計算完成,然後檢索其結果 。

避免塊UI使用AsyncTask而不調用上UI線程get方法和更新UI時doInBackground執行完整的onPostExecute

創建的AsyncTask類爲:

public class LongloadMovies extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 

      loadMovies loadmovobj =new loadMovies(); 
      String strresult=loadmovobj.getIt(); 
      return strresult; 
     }  

     @Override 
     protected void onPostExecute(String result) {  

      // Update your UI here   
     } 

} 

和執行的AsyncTask從UI線程:

new LongloadMovies().execute(""); 
+0

謝謝,我忘了這個! –

0

你不能對主UI線程的網絡操作。您需要在另一個線程或異步任務中執行此操作。 Here談論這個問題

1

爲什麼你的應用程序在Android版本3.0及以上崩潰的原因是,因爲HoneyComb,Ice Cream Sandwich和JellyBean對於UI線程的濫用要嚴格得多。例如,在Android設備上運行蜂窩或以上時,檢測到UI線程上的網絡連接,NetworkOnMainThreadException會拋出:

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException 

的解釋,爲什麼出現這種情況是有據可查的在Android開發者網站:

A NetworkOnMainThreadException is thrown when an application attempts to perform a networking operation on its main thread. This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. 

是ICS和蜂巢不會讓你在UI線程上執行其他操作的一些例子:

  1. 打開套接字連接(即新推出的So cket())。
  2. HTTP請求(即HTTPClient和HTTPUrlConnection)。
  3. 試圖連接到遠程MySQL數據庫。
  4. 下載文件(即Downloader.downloadFile())。

如果您試圖在UI線程上執行任何這些操作,則必須將它們包裝在工作線程中。最簡單的方法是使用AsyncTask,它允許您在用戶界面上執行異步工作。AsyncTask將在工作線程中執行阻塞操作,並將結果發佈到UI線程上,而無需您自己處理線程和/或處理程序。

+0

感謝您的幫助! –