NetworkOnMainThread

Я получаю NetworkOnMainThreadException, когда пытаюсь реализовать следующий код:

public class HandlingXMLStuff extends ListActivity{ static final String URL = "xml_file"; static final String ITEM = "item"; //parent static final String Id = "id"; static final String Name = "name"; static final String Desc = "desc"; static final String Link = "Link"; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.xmllist); ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>(); xmlparser parser = new xmlparser(); String xml = parser.getXmlFromUrl(URL); Document doc = parser.getDomElement(xml); NodeList nl = doc.getElementsByTagName(ITEM); //START: loop through all item nodes <item> for (int i = 0;i<nl.getLength();i++){ //lets create our HASHMAP!! (feeds items into our ArrayList) HashMap<String, String> map = new HashMap<String, String>(); Element e = (Element) nl.item(i); //add each child node to the HashMap (key, value/<String, String>) map.put(Name, parser.getValue(e, Name)); map.put(Desc, parser.getValue(e, Desc)); map.put(Link, parser.getValue(e, Link)); menuItems.add(map); }//DONE ListAdapter adapter = new SimpleAdapter(this, menuItems, R.layout.list_item, new String[] {Name, Desc, Link}, new int []{R.id.name, R.id.description, R.id.link}); setListAdapter(adapter); } } 

И обработчик:

 public class xmlparser{ public String getXmlFromUrl(String url) { String xml = null; try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); xml = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xml; } public Document getDomElement(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { Log.e("Error: ", e.getMessage()); return null; } catch (SAXException e) { Log.e("Error: ", e.getMessage()); return null; } catch (IOException e) { Log.e("Error: ", e.getMessage()); return null; } return doc; } public String getValue(Element item, String str) { NodeList n = item.getElementsByTagName(str); return this.getElementValue(n.item(0)); } public final String getElementValue( Node elem ) { Node child; if( elem != null){ if (elem.hasChildNodes()){ for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){ if( child.getNodeType() == Node.TEXT_NODE ){ return child.getNodeValue(); } } } } return ""; } 

}

Любая идея почему? Он должен работать, все обучающие материалы, которые я прочитал, рассматривают это как рабочий код, но он не запускается и выдает исключение. Я читал, что мне, возможно, понадобится реализовать asynctask, но im new to it и не уверен, какие части нуждаются в их собственном потоке. Спасибо за любую помощь, критику (конструктивную), предложения и т. Д.

Любая идея почему?

Поскольку, если этот кусок кода выполняется в основном потоке приложения, вы делаете сетевой ввод-вывод в основном потоке приложения.

Я читал, что мне, возможно, понадобится реализовать asynctask, но im new to it и не уверен, какие части нуждаются в их собственном потоке.

Я бы поставил сетевой ввод-вывод и разбор в doInBackground() и setListAdapter() в onPostExecute() для AsyncTask .

Если вы просто хотите протестировать свой код и не хотите добавлять никаких дополнительных осложнений, вы можете добавить его в свой onCreate()

 if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } 

Вы не хотите, чтобы это было постоянным, так как сетевые операции в потоке пользовательского интерфейса делают плохой опыт при использовании приложения, но могут быть полезны при тестировании.

Добавив в CommonsWare ответ, свойство NetworkOnMainThreadException было добавлено где-то между 2.3.3 (Gingerbread_MR1) и 3.0 (Honeycomb). Если вы посмотрите на

 android.app.ActivityThread 

Вы найдете следующий фрагмент кода:

  /** * For apps targetting SDK Honeycomb or later, we don't allow * network usage on the main event loop / UI thread. * * Note to those grepping: this is what ultimately throws * NetworkOnMainThreadException ... */ if (data.appInfo.targetSdkVersion > 9) { StrictMode.enableDeathOnNetwork(); } 

Я думаю, что учебники, которые вы следовали, были написаны до того, как это было введено в действие, и поэтому не вызывало исключение NetworkOnMainThreadException. Следуйте инструкциям CommonsWare относительно AsyncTask, и вы исправите свою ошибку.

Intereting Posts
Почему getView возвращает неверные объекты convertView в SeparatedListAdapter? Пример: связь между активностью и службой с использованием сообщений Запертое местоположение Api setSmallestDisplacement игнорируется / не работает Android: предотвращение двух входов в систему Facebook (SDK и браузер) при интеграции кнопки «как» Почему три (избыточный?) Вариации акселерометра в датчиках андроида Реализация чата между веб-страницей и андроидом Закройте приложение и удалите из последних приложений / Я получаю только app-release-unaligned.apk, когда я нажимаю сгенерировать подписанный apk Круговой индикатор выполнения (для таймера обратного отсчета) Недействительный запрос объявления при вызове DoubleClick для издателей с SDK AdMob Аудиопоток с помощью Android MediaPlayer Android прослушивает сообщения из серверного сокета Сохранение изображения из эскиза обработки Android Преобразование битовой карты Java в байтовый массив Приостановка службы до тех пор, пока не будет установлено соединение с Интернетом