我开发了在 android 4.0.0 版本之前运行良好的应用程序。但在 android 4.0.0 + 版本中,它会强制关闭。它说主线程异常上的网络
3 回答
您的应用程序在上面崩溃Android versions 3.0
但运行良好的Android 2.x
原因是因为HoneyComb Ice Cream Sandwich和Jelly 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
的一些示例是:ICS
HoneyComb
- 打开一个 Socket 连接(即 new Socket())。
- HTTP 请求(即 HTTPClient 和 HTTPUrlConnection)。
- 尝试连接到远程 MySQL 数据库。
- 下载文件(即 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.
“主线程异常的网络”似乎是自言自语,不是吗?
new Thread(new Runnable() {
public void run() {
yourNetworkStuff();
}
}).start();
错误本身表示您正在编写连接到主线程上的网络(url 连接)的代码。您可以编写扩展 AsyncTask 的 Async 类。它将执行其他线程。