Erro com Acesso a internet

Olá pessoal estou tentando executar uma aplicação que acessa a internet mas esta dando erro. Segue o local do erro:

[code]new Thread(new Runnable() {
@Override
public void run() {
try {

				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
				DocumentBuilder db = dbf.newDocumentBuilder();
	
				Document doc = db.parse(autoEsporteTO.getFeedNoticias());
	
				NodeList listItem = doc.getElementsByTagName("item");
	
				String[] arrayTitles = new String[listItem.getLength()];
	
				for (int x = 0; x < listItem.getLength(); x++) {
	
					String title = listItem.item(x).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
	
					String link = listItem.item(x).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
					
					ItemTO item = new ItemTO();
	
					item.setTitle(title);
					item.setUrl(link);
	
					arrayTitles[x] = item.getTitle();
	
					itemList.add(item);
				}
	
				listView.setAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, arrayTitles));
				
			} catch (Exception e) {
				trace(e.toString());
			}
		}
	}).start();[/code]

Uma exceção é lançada na linha 31:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Olá

Isso ocorre porque não é permitido mudar os componentes visuais por outra thread, isso deve ser efetuado na UI Thread.

Para isso você pode usar um objeto handle ou o método runOnUIThread para colocar uma tarefa para ser executada na UI Thread.
O comando que você deve colocar para executar na tarefa é o:

[quote=A H Gusukuma]Olá

Isso ocorre porque não é permitido mudar os componentes visuais por outra thread, isso deve ser efetuado na UI Thread.

Para isso você pode usar um objeto handle ou o método runOnUIThread para colocar uma tarefa para ser executada na UI Thread.
O comando que você deve colocar para executar na tarefa é o:

Não ficou claro a sua resposta, você pode esclarecer mais por favor?

Por segurança o Android não permite que sejam feitas alterações de elementos e ou componentes visuais em Threads secundarias.


new Thread(new Runnable() {
			@Override
			public void run() {
				try {
				
					DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					DocumentBuilder db = dbf.newDocumentBuilder();
		
					Document doc = db.parse(autoEsporteTO.getFeedNoticias());
		
					NodeList listItem = doc.getElementsByTagName("item");
		
					String[] arrayTitles = new String[listItem.getLength()];
		
					for (int x = 0; x < listItem.getLength(); x++) {
		
						String title = listItem.item(x).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
		
						String link = listItem.item(x).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
						
						ItemTO item = new ItemTO();
		
						item.setTitle(title);
						item.setUrl(link);
		
						arrayTitles[x] = item.getTitle();
		
						itemList.add(item);
					}
		
					/*listView.setAdapter(new ArrayAdapter<String>
                                        (getBaseContext(), android.R.layout.simple_list_item_1, arrayTitles));*/

                                     //Percebeu a diferença sem erro agora - Mudanças visuais implementadas aqui
                                    runOnUiThread(new Runnable() {
						public void run() {
							listView.setAdapter(new ArrayAdapter<String> 
                                                        (getBaseContext(),android.R.layout.simple_list_item_1, arrayTitles));							
						}
					});

					
				} catch (Exception e) {
					trace(e.toString());
				}
			}
		}).start();

Declare suas variaveis no inicio da Thread para que elas tenham escopo dentro do metodo que altera o componente visual

[quote=lucas93lange]Por segurança o Android não permite que sejam feitas alterações de elementos e ou componentes visuais em Threads secundarias.


new Thread(new Runnable() {
			@Override
			public void run() {
				try {
				
					DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					DocumentBuilder db = dbf.newDocumentBuilder();
		
					Document doc = db.parse(autoEsporteTO.getFeedNoticias());
		
					NodeList listItem = doc.getElementsByTagName("item");
		
					String[] arrayTitles = new String[listItem.getLength()];
		
					for (int x = 0; x < listItem.getLength(); x++) {
		
						String title = listItem.item(x).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
		
						String link = listItem.item(x).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
						
						ItemTO item = new ItemTO();
		
						item.setTitle(title);
						item.setUrl(link);
		
						arrayTitles[x] = item.getTitle();
		
						itemList.add(item);
					}
		
					/*listView.setAdapter(new ArrayAdapter<String>
                                        (getBaseContext(), android.R.layout.simple_list_item_1, arrayTitles));*/

                                     //Percebeu a diferença sem erro agora - Mudanças visuais implementadas aqui
                                    runOnUiThread(new Runnable() {
						public void run() {
							listView.setAdapter(new ArrayAdapter<String> 
                                                        (getBaseContext(),android.R.layout.simple_list_item_1, arrayTitles));							
						}
					});

					
				} catch (Exception e) {
					trace(e.toString());
				}
			}
		}).start();

Declare suas variaveis no inicio da Thread para que elas tenham escopo dentro do metodo que altera o componente visual[/quote]

Cara muito obrigado, eu já fucei a internet procurando uma solução mas nunca dava certo. Então eu já havia até desistido, nem a minha pouca experiência com Threads e o estudo da certificação me fez enxergar o problema.

Grato!