【问题标题】:exception being thrown when performing http GET request from android [duplicate]从android执行http GET请求时抛出异常[重复]
【发布时间】:2012-10-09 19:31:35
【问题描述】:

可能重复:
Android HttpClient : NetworkOnMainThreadException

我在服务器上有一个 php 脚本,它接收 get 请求,并将内容邮寄出去。 所以假设我们有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)

【问题讨论】:

  • 将网络相关操作从onCreate()中移除,放到AyncTask中。

标签: android


【解决方案1】:

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

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

【讨论】:

  • 所以如果我把它移到另一种方法它会起作用吗?我有一个“反馈”方法,无论如何这最终都会出现
  • 好吧,这个 coed 需要转移到一个在后台非 Ui 线程上运行的函数。最好的选择是使用 AsyncTask 的 doInBackground()。
【解决方案2】:

正如异常名称所示,不允许在主线程上执行网络操作。见the reference documentation。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 2015-11-18
      相关资源
      最近更新 更多