我在为 RssReader 运行Android 项目时出了一个error。
代码如下:
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"/>
我用一个新的 Thread解决了这个问题。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
//Your code goes here
} catch (Exception e) {
e.printStackTrace();
}
}});
thread.start();