HttpURLConnection is throwing exception
这是我连接
1 2 3 4 5 | 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是因为您正在主UI线程上进行网络调用。而是使用asynctask。
asynctask的文档.http://developer.android.com/reference/android/os/AsyncTask.html。
在UI线程中调用AsyncTask。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | @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旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。
在robospice中替代asynctask。 https://github.com/octo-online/robospice。
robospice的一些特征。
1.异步执行(在后台AndroidService中)网络请求(例如:使用Spring Android的REST请求)。
2.强烈打字!您使用POJO发出请求,并获得POJO作为请求结果。
3.对用于请求的POJO或您在项目中使用的Activity类都不施加任何约束。
4.caches结果(在Json中使用Jackson和Gson,或Xml,或平面文本文件,或二进制文件,甚至使用ORM Lite)。
5.当且仅当它们仍然存在时,通知您的活动(或任何其他上下文)网络请求的结果
6.完全没有内存泄漏,比如Android Loaders,不像Android AsyncTasks通过他们的UI线程通知你的活动。
7.使用简单但强大的异常处理模型。
NetworkOnMainThreadException:应用程序尝试在其主线程上执行网络操作时引发的异常。
你应该在asynctask上调用sendfeedback方法然后只有上面的代码才能工作。由于网络服务器花费了大量时间来响应主线程变得反应迟钝。要避免它,你应该在另一个线程上调用它。因此asynctask更好。
http://android-developers.blogspot.in/2009/05/painless-threading.html