-2

我开发了在 android 4.0.0 版本之前运行良好的应用程序。但在 android 4.0.0 + 版本中,它会强制关闭。它说主线程异常上的网络

4

3 回答 3

8

您的应用程序在上面崩溃Android versions 3.0但运行良好的Android 2.x原因是因为HoneyComb Ice Cream SandwichJelly Bean对 UI 线程的滥用更加严格。例如,当运行HoneyComb或以上的Android设备在UI线程上检测到网络访问时,NetworkOnMainThreadException会抛出a:

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example/com.example.ExampleActivity}:android.os.NetworkOnMainThreadException

Android 开发人员的网站上有详细记录为什么会发生这种情况的解释:

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

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

If you are attempting to perform any of these operations on the UI thread, you must wrap them in a worker thread. The easiest way to do this is to use of an AsyncTask, which allows you to perform asynchronous work on your user interface. An AsyncTask will perform the blocking operations in a worker thread and will publish the results on the UI thread, without requiring you to handle threads and/or handlers yourself.

于 2012-10-15T13:37:21.243 回答
1

“主线程异常的网络”似乎是自言自语,不是吗?

    new Thread(new Runnable() {
        public void run() {
            yourNetworkStuff();
        }
    }).start();
于 2012-10-15T13:20:23.730 回答
0

错误本身表示您正在编写连接到主线程上的网络(url 连接)的代码。您可以编写扩展 AsyncTask 的 Async 类。它将执行其他线程。

于 2012-10-15T13:28:38.463 回答