14

这是我的连接代码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

请帮忙。

4

2 回答 2

36

android.os.NetworkOnMainThreadException 发生是因为您正在主 UI 线程上进行网络调用。而是使用异步任务。

异步任务的文档。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 包提供的各种 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.使用简单但健壮的异常处理模型。

于 2013-03-19T09:59:43.200 回答
5

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

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

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

于 2013-03-19T09:59:55.737 回答