这个问题已经在这里有一个答案:
- 如何解决android.os.NetworkOnMainThreadException? 53个回答
这里是我的代码来连接HTTP
。
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
请帮忙。
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.executes异步(在后台AndroidService)网络请求(例如:使用Spring的Android REST请求)。
2.is强类型! 你让使用的POJO你的要求,你会得到的POJO作为请求的结果。
3.enforce既不用于请求的POJO也没有对你在项目中使用活动课,没有任何限制。
4.caches结果(以JSON既杰克逊和GSON,或XML或纯文本文件或二进制文件,即使使用ORM精简版)。
5.notifies网络请求的结果,你的活动(或其他任何情况下)当且仅当他们还活着
6.no内存泄漏可言,像Android这样装载机,不像安卓AsyncTasks通知自己的UI线程你的活动。
7.uses一个简单而强大的异常处理模型。
NetworkOnMainThreadException:当应用程序试图在其主线程进行网络操作时引发的异常。
你应该叫sendfeedback方法上的AsyncTask那么只有上面的代码将正常工作。 作为Web服务器正在采取大量的时间来响应主线程变得反应迟钝。 为了避免它,你应该把它在另一个线程。 因此的AsyncTask是更好的。
http://android-developers.blogspot.in/2009/05/painless-threading.html