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!