造成网络上主线程异常错误的主要原因是新版android对UI线程的滥用非常严格。每当我们打开一个应用程序时,就会创建一个新的“主”线程,它帮助应用程序与应用程序UI的运行组件进行交互,并负责将事件分派给指定的小部件。在UI线程上执行耗时的操作时,整个用户界面都会被阻塞。
当应用程序尝试在主线程上执行网络操作时,将引发“在主线程上网络”异常错误。该错误显示在所有针对Honeycomb SDK或更高版本的应用程序上。应用程序无法下载文件、连接到远程MySQL数据库、执行HTTP请求或建立套接字连接。
解决方案是将任何试图执行诸如下载文件、连接到远程MySQL数据库、执行HTTP请求或建立套接字连接等操作的任务完全打包到一个单独的异步函数中。新线程是由async函数创建的,因此,这些进程不会在UI线程上运行。我们也可以重写指令,但在这种情况下,任务管理器可能必须终止应用程序,这将使应用程序没有响应。
方法1
要克服这种情况,请将以下内容添加到用户执行网络操作的类中:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
向manifest.xml文件添加以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
方法2
使用新线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// Your code goes here
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();