2013-03-19 69 views
5

這裏是我的代碼連接HTTPHttpURLConnection拋出異常

URL url = new URL("http://www.google.com"); 
       HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
       con.setDoOutput(true); 
       String responseMsg = con.getResponseMessage(); 
       int response = con.getResponseCode(); 

這是投擲android.os.NetworkOnMainThreadException

請幫助。

+3

將您的代碼移入AsyncTask,它將解決您的問題。檢查[android.os.NetworkOnMainThreadException](http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – Sajmon 2013-03-19 10:00:23

回答

24

android.os.NetworkOnMainThreadException因爲您在主UI線程上進行網絡調用而發生。相反,使用asynctask。

asynctask的文檔。 http://developer.android.com/reference/android/os/AsyncTask.html

在您的UI線程中調用AsyncTask。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    new MyDownloadTask().execute(); 

} 

class MyDownloadTask extends AsyncTask<Void,Void,Void> 
{ 


    protected void onPreExecute() { 
     //display progress dialog. 

} 
    protected Long doInBackground(Void... params) { 
      URL url = new URL("http://www.google.com"); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      con.setDoOutput(true); 
      String responseMsg = con.getResponseMessage(); 
      int response = con.getResponseCode(); 
    return null; 
} 



protected void onPostExecute(VOid result) { 
    // dismiss progress dialog and update ui 
} 
} 

注意:的AsyncTask的設計是圍繞線程和處理程序一個輔助類,並不構成通用線程框架。理想情況下,AsyncTasks應該用於短操作(最多幾秒)。如果您需要保持線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API,例如執行器,ThreadPoolExecutor和FutureTask。

替代robospice中的asynctask。 https://github.com/octo-online/robospice

robospice的一些功能。

1.異步執行(在後臺AndroidService中)網絡請求(例如:使用Spring Android的REST請求)。

2.is strong typed!您使用POJO提出您的請求,並根據請求結果獲得POJO。

3.enforce既沒有限制用於請求的POJOs,也沒有在您的項目中使用的Activity類。 (使用Jackson和Gson,或者Xml,或者平面文本文件,或者二進制文件,甚至使用ORM Lite)。

5.notifies您的網絡請求的結果的活動(或其他任何情況下)當且僅當他們還活着

6.no內存泄漏可言,像Android這樣裝載機,不像Android的AsyncTasks通知你的UI線程上的活動。

7.使用簡單但強大的異常處理模型。

+0

我覺得'MyDownloadTask()。execute();'應該是'new MyDownloadTask()。execute();'。 +1爲描述性答案。 – 2013-03-19 10:09:28

+0

是。抱歉錯字錯誤。修復。 – Raghunandan 2013-03-19 10:10:21

4

NetworkOnMainThreadException:應用程序嘗試在其主線程上執行聯網操作時引發的異常。

你應該在asynctask上調用sendfeedback方法,然後只有上面的代碼才能工作。由於Web服務器花費大量時間響應主線程變得無法響應。爲了避免它,你應該在另一個線程上調用它。因此,asynctask更好。

http://android-developers.blogspot.in/2009/05/painless-threading.html