如何修复 'android.os.NetworkOnMainThreadException' 错误?
首先我们看 android.os.NetworkOnMainThreadException
错误产生的一个场景。在 Android 项目中,我们使用 RssReader 时,看下面一段代码
URLurl=newURL(urlToRssFeed);
SAXParserFactoryfactory= SAXParserFactory.newInstance();
SAXParserparser= factory.newSAXParser();
XMLReaderxmlreader= parser.getXMLReader();
RssHandlertheRSSHandler=newRssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSourceis=newInputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
上面这段代码在运行的时候就会产生 android.os.NetworkOnMainThreadException 错误。
由于以前版本的 Android 中存在错误,系统没有将写入主线程上的 TCP 套接字标记为违反严格模式。 Android 7.0 修复了这个bug。 表现出此行为的应用程序现在会引发 android.os.NetworkOnMainThreadException。
那应该如何解决这个问题呢?
当应用程序尝试在其主线程上执行网络操作时,将引发此异常。 要解决此问题,可以在 AsyncTask 中运行代码:
lass RetrieveFeedTask extendsAsyncTask<String, Void, RSSFeed> {
private Exception exception;
protected RSSFeed doInBackground(String... urls) {
try {
URLurl=newURL(urls[0]);
SAXParserFactoryfactory= SAXParserFactory.newInstance();
SAXParserparser= factory.newSAXParser();
XMLReaderxmlreader= parser.getXMLReader();
RssHandlertheRSSHandler=newRssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSourceis=newInputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
} catch (Exception e) {
this.exception = e;
returnnull;
} finally {
is.close();
}
}
protectedvoidonPostExecute(RSSFeed feed) {
// TODO: 检测 this.exception
// TODO: 使用 feed 执行某些操作
}
}
如何执行上面的任务?
在 MainActivity.java 文件中,我们可以在 oncreate() 方法中添加下面一行代码
newRetrieveFeedTask().execute(urlToRssFeed);
不要忘记将下面的内容添加到 AndroidManifest.xml 文件中:
<uses-permissionandroid:name="android.permission.INTERNET"/>
本文转载自:迹忆客(https://www.jiyik.com)
以上是 如何修复 'android.os.NetworkOnMainThreadException' 错误? 的全部内容, 来源链接: utcz.com/z/290295.html