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

发布于 2021-01-30 17:47:03

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

如何解决此问题?

关注者
0
被浏览
419
1 个回答
  • 面试哥
    面试哥 2021-01-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
        }
    }
    

    如何执行任务:

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

    new RetrieveFeedTask().execute(urlToRssFeed);
    

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

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看