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