networkonmainthread - NetworkOnMainThread如何修复 android.os.NetworkOnMainThreadException?

  显示原文与译文双语对照的内容

我在运行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



我该如何解决此问题?

时间:

当应用程序尝试在它的主线程上执行网络操作时引发这里异常。 在 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 file:


<uses-permission android:name="android.permission.INTERNET"/>



在线程上或者异步任务上,几乎总是运行网络操作。 但是,如果你更清楚且愿意接受结果,并且必须在主线程上执行网络操作,则可以重写默认行为:

添加:


StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();



StrictMode.setThreadPolicy(policy); 



在你的课上

在 android manifest.xml file: 中添加这里权限


<uses-permission android:name="android.permission.INTERNET"/>



结果:

你的应用程序会变得无React并锁定,用户感觉缓慢,并且不得不强制杀死你的应用程序,并且你会发现管理器终止应用程序,告诉用户应用程序已经停止运行。

Android在设计响应性方面有一些好的编程实践技巧: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

...