如何修复android.os.NetworkOnMainThreadException?


我在为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

我该如何解决这个问题?


达令说
浏览 4783回答 9
9回答

阿晨1998

当应用程序尝试在其主线程上执行网络操作时,将引发此异常。运行您的代码AsyncTask:class&nbsp;RetrieveFeedTask&nbsp;extends&nbsp;AsyncTask<String,&nbsp;Void,&nbsp;RSSFeed>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Exception&nbsp;exception; &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;RSSFeed&nbsp;doInBackground(String...&nbsp;urls)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;new&nbsp;URL(urls[0]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParserFactory&nbsp;factory&nbsp;=&nbsp;SAXParserFactory.newInstance(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParser&nbsp;parser&nbsp;=&nbsp;factory.newSAXParser(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLReader&nbsp;xmlreader&nbsp;=&nbsp;parser.getXMLReader(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RssHandler&nbsp;theRSSHandler&nbsp;=&nbsp;new&nbsp;RssHandler(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlreader.setContentHandler(theRSSHandler); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputSource&nbsp;is&nbsp;=&nbsp;new&nbsp;InputSource(url.openStream()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlreader.parse(is); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;theRSSHandler.getFeed(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.exception&nbsp;=&nbsp;e; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onPostExecute(RSSFeed&nbsp;feed)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO:&nbsp;check&nbsp;this.exception &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO:&nbsp;do&nbsp;something&nbsp;with&nbsp;the&nbsp;feed &nbsp;&nbsp;&nbsp;&nbsp;}}如何执行任务:在MainActivity.java文件中,您可以在oncreate()方法中添加此行new&nbsp;RetrieveFeedTask().execute(urlToRssFeed);不要忘记将其添加到AndroidManifest.xml文件中:<uses-permission&nbsp;android:name="android.permission.INTERNET"/>

慕森卡

我用新的方法解决了这个问题Thread。Thread&nbsp;thread&nbsp;=&nbsp;new&nbsp;Thread(new&nbsp;Runnable()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Your&nbsp;code&nbsp;goes&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}});thread.start();

largeQ

你可以不执行网络I / O在UI线程上的蜂窝。从技术上讲,这是可能在早期版本的Android,但它是一个非常糟糕的主意,因为它会导致你的应用程序停止响应,并可能导致操作系统杀死你的应用程序被用于非常表现。您需要运行后台进程或使用AsyncTask在后台线程上执行网络事务。Android开发者网站上有一篇关于无痛线程的文章,这是对此的一个很好的介绍,它将为您提供比这里现实提供的更好的答案深度。

慕尼黑的夜晚无繁华

不要使用strictMode(仅在调试模式下)不要更改SDK版本不要使用单独的线程使用Service或AsyncTask另请参阅Stack Overflow问题:android.os.NetworkOnMainThreadException从Android发送电子邮件

白衣染霜花

基于网络的操作无法在主线程上运行。您需要在子线程上运行所有基于网络的任务或实现AsyncTask。这是您在子线程中运行任务的方式:new&nbsp;Thread(new&nbsp;Runnable(){ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;run()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Your&nbsp;implementation&nbsp;goes&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception&nbsp;ex)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}).start();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android
Java