java - 如何修复 'android.os.NetworkOnMainThreadException' ?

标签 java android android-networking networkonmainthread

我在运行 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

如何解决这个问题?

最佳答案

注意:AsyncTask 在 API 级别 30 中已弃用。
AsyncTask | Android Developers

当应用程序尝试在其主线程上执行网络操作时,会引发此异常。运行 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
    }
}

如何执行任务:

MainActivity.java 文件中,您可以在 oncreate() 方法中添加此行

new RetrieveFeedTask().execute(urlToRssFeed);

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

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

关于java - 如何修复 'android.os.NetworkOnMainThreadException' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61844989/

相关文章:

Java线程启动延迟

java - 合并多个图像使android非常慢

android - 从 Android Wear 心率传感器读取底层颜色/光数据?

android - 在 android 4.0 驱动的设备(如 Galaxy s3)上使用 surfaceview 使用自定义相机拍摄的图像显示分辨率较低

java - 字符串以 '\n' 结尾最有效的操作方法是什么?

java - setenv.sh 不工作

java - 带有来自其他 Maven 模块的部分 JSP 文件的 Spring Boot 应用程序

android - 在 android.intent.action.BOOT_COMPLETED 上获取网络

android - 接收 XML 文件已损坏(在 sprint 网络上)?

android - 网络处于 AsyncTask 和 NetworkOnMainThreadException 错误