我在运行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
中运行代码:
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"/>
您几乎应该总是在线程上或作为异步任务运行网络操作。
但如果您愿意接受后果,则可以删除此限制并覆盖默认行为。
添加:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
在你们班上,
和
在android Manifest.xml文件中添加此权限: ;  ;
<uses-permission android:name="android.permission.INTERNET"/>
后果:
你的应用程序(在互联网连接不稳定的地区)会变得没有响应并锁死,用户会感觉到速度变慢,必须强制关闭,而你可能会冒着activity经理关闭你的应用程序并告诉用户应用程序已经停止的风险。
Android有一些关于设计响应性的良好编程实践的好提示:http://developer.Android.com/reference/Android/os/networkonmainthreadexception.html
我使用新的线程
解决了这个问题。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
//Your code goes here
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();