如何修复 '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

回到顶部