我该如何解决android.os.NetworkOnMainThreadException?
我在运行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"/>
后果:
您的应用程序将会(在网络连接不正常的情况下)变得无响应并且锁定,用户感觉到速度缓慢并且必须执行强制终止操作,并且您冒着活动管理器查杀您的应用程序并告知用户应用程序已停止。
Android有一些好的编程实践的技巧来设计响应:http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html
我使用新Thread
解决了这个问题。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
//Your code goes here
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
链接地址: http://www.djcxy.com/p/771.html