0

可能重复:
Android HttpClient:NetworkOnMainThreadException

我在接收 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)
4

3 回答 3

1

由于主 UI 线程上的网络活动,应用程序正在崩溃,这本身并不是一个很好的做法,因为应用程序可能会停止响应并可能被操作系统杀死。您应该始终尝试在某个单独的线程中进行后台处理,而不是在主 UI 线程中。

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

于 2012-10-09T19:34:38.080 回答
0

正如异常名称所示,不允许您在主线程上执行网络操作。请参阅参考文档

于 2012-10-09T19:35:11.133 回答
0

当应用程序尝试在其主线程上执行网络操作时,会引发NetworkOnMainThreadException 。这仅针对面向 Honeycomb SDK 或更高版本的应用程序抛出。允许以早期 SDK 版本为目标的应用程序在其主事件循环线程上进行网络连接,但非常不鼓励这样做。ICS 和 HoneyComb 不允许您在 UI 线程上执行的其他一些操作示例如下:

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

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

于 2012-10-09T19:44:35.127 回答