迹忆客 专注技术分享

当前位置:主页 > 学无止境 >

如何修复 'android.os.NetworkOnMainThreadException' 错误?

作者:迹忆客 最近更新:2023/01/08 浏览次数:

首先我们看 android.os.NetworkOnMainThreadException 错误产生的一个场景。在 Android 项目中,我们使用 RssReader 时,看下面一段代码

URL url = new URL(urlToRssFeed);
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();

上面这段代码在运行的时候就会产生 android.os.NetworkOnMainThreadException 错误。

由于以前版本的 Android 中存在错误,系统没有将写入主线程上的 TCP 套接字标记为违反严格模式。 Android 7.0 修复了这个bug。 表现出此行为的应用程序现在会引发 android.os.NetworkOnMainThreadException。

那应该如何解决这个问题呢?

当应用程序尝试在其主线程上执行网络操作时,将引发此异常。 要解决此问题,可以在 AsyncTask 中运行代码:

lass RetrieveFeedTask extends AsyncTask<String, Void, RSSFeed> {

    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;
        } finally {
            is.close();
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: 检测 this.exception
        // TODO: 使用 feed 执行某些操作
    }
}

如何执行上面的任务?

在 MainActivity.java 文件中,我们可以在 oncreate() 方法中添加下面一行代码

new RetrieveFeedTask().execute(urlToRssFeed);

不要忘记将下面的内容添加到 AndroidManifest.xml 文件中:

<uses-permission android:name="android.permission.INTERNET"/>

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Java 在 MongoDB 中生成 ObjectId

发布时间:2023/04/20 浏览次数:179 分类:MongoDB

本文将讨论 ObjectId 以及我们如何使用 Java 程序生成它。 为了使主题更简单,我们将看到一个带有解释的示例,以使主题更容易。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便