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.使用簡單但強大的異常處理模型。
將您的代碼移入AsyncTask,它將解決您的問題。檢查[android.os.NetworkOnMainThreadException](http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – Sajmon 2013-03-19 10:00:23