当前位置: 首页 > 知识库问答 >
问题:

我如何修复android。操作系统。NetworkOnMainThreadException'?

殷浩慨
2023-03-14

我在运行RssReader的Android项目时出错。

代码

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

如何解决此问题?

共有3个答案

贝嘉泽
2023-03-14

我用一个新的线程解决了这个问题。

Thread thread = new Thread(new Runnable() {

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

thread.start(); 
邬英武
2023-03-14

您几乎应该始终在线程上或作为异步任务运行网络操作。

但是,如果你愿意接受后果,就有可能取消这个限制并覆盖默认行为。

添加:

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

StrictMode.setThreadPolicy(policy);

在你们班上,

在Android清单中添加此权限。xml文件:

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

后果:

你的应用程序(在网络连接不稳定的区域)将变得无响应和锁定,用户感觉速度慢,必须进行强制终止,你有可能让活动经理终止你的应用程序,并告诉用户应用程序已停止。

Android提供了一些关于良好编程实践的好提示,以设计响应能力:NetworkOnMainThreadException | Android开发者

萧展鹏
2023-03-14

注意:AsyncTask在API级别30中被弃用

当应用程序尝试在其主线程上执行网络操作时,会引发此异常。在AsyncTask中运行您的代码:

class 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: check this.exception
        // TODO: do something with the feed
    }
}

如何执行任务:

main活动中。java文件您可以在您的oncreate()方法中添加此行

new RetrieveFeedTask().execute(urlToRssFeed);

不要忘记将其添加到AndroidManifest。xml文件:

<uses-permission android:name="android.permission.INTERNET"/>
 类似资料:
  • 在这里,我正在使用此代码加载Json。它可以在android 2.2上正常工作,但当我使用android 4.2时,它会引发android.os.NetworkOnMainThreadException异常,请给我解决方案 } 我也在使用谷歌api。

  • 其中“url”是JSON格式的,它使用http GET方法返回大量数据。 我无法从我在getResultForRequest(url)方法中传递的“url”中获取JSON格式的数据。我在urlConnection.connect();中出错。Internet权限也在AndroidManifest.xml文件中给出。 这是我的日志。 提前谢谢。

  • 在我的应用程序中,我得到了android。操作系统。NetworkOnMainThreadException。我正在尝试从url获取图像,当时我遇到了这个异常。若我在2.2中运行应用程序,它可以正常工作,但若我在4.0中运行,就会出现异常。 我有错误 在这一行请帮我解决这个问题 我使用了AsyncTask 我在这行中遇到了错误: Logcat:

  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成

  • 我试图通过以下方式了解手机操作系统是否运行在flutter app的IOS或android上: 以便在检测到操作系统后设置if条件。我如何控制它?有人知道这个问题的解决方案吗?

  • sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的