2012-10-09 48 views
0

可能重複請求時被拋出:
Android HttpClient : NetworkOnMainThreadException例外執行HTTP GET從安卓

我有一個PHP腳本,臨危獲得請求的服務器上,並郵寄出去的內容。 因此,讓我們說我們有http://url.com/testmail.php?message=somemessage

「消息」的內容將通過電子郵件發送。

我希望我的應用程序能夠調用此腳本,並在請求中插入它自己的消息。它將主要用於用戶反饋。我知道使用POST會更好,如果有一些可以本地處理郵件的android函數,請在我新的時候給予啓發。

這是我在裏面我的主要活動「的onCreate」此刻的代碼,它是產生異常:

HttpClient httpClient = new DefaultHttpClient(); 
    String url = "http://someurl/testmail.php?message=eventualjavavariable"; 
    HttpGet httpGet = new HttpGet(url); 
    try { 
     HttpResponse response = httpClient.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     if (statusLine.getStatusCode() == HttpStatus.SC_OK) { 
      HttpEntity entity = response.getEntity(); 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      entity.writeTo(out); 
      out.close(); 
      String responseStr = out.toString(); 
      // do something with response 
     } else { 
      // handle bad response 
     } 
    } catch (ClientProtocolException e) { 
     // handle exception 
    } catch (IOException e) { 
     // handle exception 
    } 

我也有我的Android清單文件中加入這一行:

<uses-permission android:name="android.permission.INTERNET"/> 

我在做什麼錯了?

這是我的logcat:

10-09 15:12:33.185: E/AndroidRuntime(5561): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.fragments/com.example.android.fragments.MainActivity}: android.os.NetworkOnMainThreadException 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
+0

從'onCreate()'中刪除與網絡相關的操作並將其放入'AyncTask'中。 – user370305

回答

1

應用程序崩潰是由於主UI線程,它本身不是一個非常好的做法上的網絡活動,如應用程序可以停止響應,並可能通過被殺操作系統。您應該總是嘗試在某個單獨的線程中執行後臺處理,而不是在主UI線程中執行後臺處理。

您需要在後臺線程上創建HttpConnection,可能需要使用AsyncTask

+0

所以如果我把它移動到另一種方法,它會工作?我有一個「反饋」的方法,這最終將在任何 – Ryan

+0

嗯,這個coed需要轉移到一個函數,在後臺非UI線程上運行。最好的選擇是使用AsyncTask的'doInBackground()'。 – Swayam

0

A NetworkOnMainThreadException當應用程序嘗試在其主線程上執行聯網操作時引發。這隻適用於定位到Honeycomb SDK或更高版本的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上進行聯網,但非常不鼓勵。 是ICS和蜂巢不會讓你在UI線程上執行一些其他操作的例子是:

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

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