HttpURLConnection抛出异常

时间:2013-03-19 09:58:20

标签: android httpurlconnection

以下是连接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

请帮忙。

2 个答案:

答案 0 :(得分:29)

发生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旨在成为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.使用简单但强大的异常处理模型。

答案 1 :(得分:4)

NetworkOnMainThreadException :应用程序尝试在其主线程上执行网络操作时引发的异常。

你应该在asynctask上调用sendfeedback方法然后只有上面的代码才能工作。由于网络服务器花费了大量时间来响应主线程变得反应迟钝。要避免它,你应该在另一个线程上调用它。因此asynctask更好。

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