2012-10-09 30 views
0

可能重复请求时被抛出:
Android HttpClient : NetworkOnMainThreadException例外执行HTTP GET从安卓

我有一个PHP脚本,临危获得请求的服务器上,并邮寄出去的内容。 因此,让我们说我们有http://url.com/testmail.php?message=somemessage

“消息”的内容将通过电子邮件发送。

我希望我的应用程序能够调用此脚本,并在请求中插入它自己的消息。它将主要用于用户反馈。我知道使用POST会更好,如果有一些可以本地处理邮件的android函数,请在我新的时候给予启发。

这是我在里面我的主要活动“的onCreate”此刻的代码,它是产生异常:

HttpClient httpClient = new DefaultHttpClient(); 
    String url = "http://someurl/testmail.php?message=eventualjavavariable"; 
    HttpGet httpGet = new HttpGet(url); 
    try { 
     HttpResponse response = httpClient.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     if (statusLine.getStatusCode() == HttpStatus.SC_OK) { 
      HttpEntity entity = response.getEntity(); 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      entity.writeTo(out); 
      out.close(); 
      String responseStr = out.toString(); 
      // do something with response 
     } else { 
      // handle bad response 
     } 
    } catch (ClientProtocolException e) { 
     // handle exception 
    } catch (IOException e) { 
     // handle exception 
    } 

我也有我的Android清单文件中加入这一行:

<uses-permission android:name="android.permission.INTERNET"/> 

我在做什么错了?

这是我的logcat:

10-09 15:12:33.185: E/AndroidRuntime(5561): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.fragments/com.example.android.fragments.MainActivity}: android.os.NetworkOnMainThreadException 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-09 15:12:33.185: E/AndroidRuntime(5561):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
+0

从'onCreate()'中删除与网络相关的操作并将其放入'AyncTask'中。 – user370305

回答

1

应用程序崩溃是由于主UI线程,它本身不是一个非常好的做法上的网络活动,如应用程序可以停止响应,并可能通过被杀操作系统。您应该总是尝试在某个单独的线程中执行后台处理,而不是在主UI线程中执行后台处理。

您需要在后台线程上创建HttpConnection,可能需要使用AsyncTask

+0

所以如果我把它移动到另一种方法,它会工作?我有一个“反馈”的方法,这最终将在任何 – Ryan

+0

嗯,这个coed需要转移到一个函数,在后台非UI线程上运行。最好的选择是使用AsyncTask的'doInBackground()'。 – Swayam

0

A NetworkOnMainThreadException当应用程序尝试在其主线程上执行联网操作时引发。这只适用于定位到Honeycomb SDK或更高版本的应用程序。针对早期SDK版本的应用程序允许在其主要事件循环线程上进行联网,但非常不鼓励。 是ICS和蜂巢不会让你在UI线程上执行一些其他操作的例子是:

  1. 打开一个Socket连接(即新的Socket())。
  2. HTTP请求(即HTTPClient和HTTPUrlConnection)。
  3. 试图连接到远程MySQL数据库。
  4. 下载文件(即Downloader.downloadFile())。

如果您试图在UI线程上执行任何这些操作,则必须将它们包装在工作线程中。最简单的方法是使用一个AsyncTask,它允许您在用户界面上执行异步工作。一个AsyncTask将在工作线程中执行阻塞操作,并将结果发布到UI线程上,而无需您自己处理线程和/或处理程序。