如何修复 'android.os.NetworkOnMainThreadException' 错误?
首先我们看 android.os.NetworkOnMainThreadException
错误产生的一个场景。在 Android 项目中,我们使用 RssReader 时,看下面一段代码
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 错误。
由于以前版本的 Android 中存在错误,系统没有将写入主线程上的 TCP 套接字标记为违反严格模式。 Android 7.0 修复了这个bug。 表现出此行为的应用程序现在会引发 android.os.NetworkOnMainThreadException。
那应该如何解决这个问题呢?
当应用程序尝试在其主线程上执行网络操作时,将引发此异常。 要解决此问题,可以在 AsyncTask 中运行代码:
lass 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: 检测 this.exception
// TODO: 使用 feed 执行某些操作
}
}
如何执行上面的任务?
在 MainActivity.java 文件中,我们可以在 oncreate() 方法中添加下面一行代码
new RetrieveFeedTask().execute(urlToRssFeed);
不要忘记将下面的内容添加到 AndroidManifest.xml 文件中:
<uses-permission android:name="android.permission.INTERNET"/>
相关文章
使用 Java 在 MongoDB 中生成 ObjectId
发布时间:2023/04/20 浏览次数:179 分类:MongoDB
-
本文将讨论 ObjectId 以及我们如何使用 Java 程序生成它。 为了使主题更简单,我们将看到一个带有解释的示例,以使主题更容易。
在 PHP 变量中存储 Div Id 并将其传递给 JavaScript
发布时间:2023/03/29 浏览次数:69 分类:PHP
-
本文教导将 div id 存储在 PHP 变量中并将其传递给 JavaScript 代码。
如何在 Java 中把日期转换为字符串
发布时间:2023/03/28 浏览次数:192 分类:Java
-
本篇文章介绍了如何在 Java 中把 java.util.Date 转换为字符串 String。