📜  如何修复 Android Studio 中的“android.os.Network On 主线程异常错误”?

📅  最后修改于: 2022-05-13 01:58:44.567000             🧑  作者: Mango

如何修复 Android Studio 中的“android.os.Network On 主线程异常错误”?

Network On Main Thread Exception Error的主要原因是因为较新版本的android对UI线程滥用非常严格。每当我们打开一个应用程序时,都会创建一个新的“主”线程,它帮助应用程序与应用程序 UI 的运行组件进行交互,并负责将事件分派给分配的小部件。当在 UI 线程上执行耗时的操作时,整个用户界面都会被阻塞。

当应用程序尝试在主线程上执行网络操作时,会引发 Network On Main Thread Exception Error。该错误显示在针对 Honeycomb SDK 或更高版本的所有应用程序上。应用程序无法下载文件、连接到远程 MySQL 数据库、执行 HTTP 请求或建立套接字连接。

解决方案

解决方案是将尝试执行下载文件、连接到远程 MySQL 数据库、执行 HTTP 请求或建立套接字连接等操作的任何任务完全包装到单独的异步函数中。 async函数会创建一个新线程,因此这些进程不会在 UI 线程上运行。我们也可以覆盖指令,但在这种情况下,任务管理器可能不得不终止应用程序,这会使应用程序无响应。

解决方案 1

为了克服这种情况,将以下内容添加到用户正在执行网络操作的类中:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

将以下权限添加到 manifest.xml 文件:

解决方案 2

为了解决这个问题,我们将使用一个新的线程

例子:

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try  {
            // Your code goes here
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

thread.start(); 

解决方案 3

  1. 不要使用 strictMode(仅在调试模式下)
  2. 请勿更改 SDK 版本
  3. 不要使用单独的线程

解决方案 4

当应用程序尝试在主线程上执行网络操作时,会引发 Network On Main Thread Exception Error。

例子:

class RetrieveFeedTask extends AsyncTask {

    private Exception exception;

    protected RSSFeed doInBackground(String... urls) {
        try {
            URL url = new URL(urls[0]);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader xmlreader = parser.getXMLReader();
            RssHandler theRSSHandler = new RssHandler();
            xmlreader.setContentHandler(theRSSHandler);
            InputSource is = new InputSource(url.openStream());
            xmlreader.parse(is);

            return theRSSHandler.getFeed();
        } catch (Exception e) {
            this.exception = e;

            return null;
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: check this.exception
        // TODO: do something with the feed
    }
}

解决方案 5

用于在MainActivity 中执行任务。 Java文件,我们将在onCreate()方法中添加这一行

new RetrieveFeedTask().execute(urlToRssFeed); 

并且不要忘记将其添加到AndroidManifest.xml 文件中: