Thread [RESOLVIDO]

Pessoal…
Estou criando 1 thread em android…
Mas nele não tem o EventQueue

Como posso fazer sem ele, ou substituindo-o?
Código:

private class ClockRunnable implements Runnable { public void run() { try { while (true) { // EventQueue.invokeLater(new Runnable() { // public void run() { // } // }); trocaimagem(); Thread.sleep(5000); } } catch (InterruptedException e) { } } }
Tive que tirar onde tá com os //, pq não existe o EventQueue no Android…
Pensei que ia funcionar sem ele, mas mesmo assim ele dá pau…

Ele faz o trocaimagem() só 1 vez, e na proxima ele ja dá pau…

Eu xamo a thread assim:

Thread minhathread = new Thread(new ClockRunnable(), "MinhaThread"); minhathread.start();
Axo que precisava de algo ali no EventQueue

Deixa eu explicar melhor:
É 1 programa, que de 5 em 5 segundo, ele fica trocando uma imagem que ta na tela…
Se a imagem for a de id(0), vai pra id(1), até o id(10), e depois volta pro id(0)…

Só isso que preciso fazer nessa thread…
Chamar o método trocaimagem(), e travá-la por 5 segundos.

Existe 1 modo de fazer 1 thread “mais simples”?

PS: Eu tenho certeza que o erro não tá no trocaimagem()… Já fiz vários testes com ele…
E também ja tentei fazer outras coisas na thread, e ela só executa 1 vez, e na segunda dá pau.

Bem, a imagem creio que você esteja guardando em um JLabel, assim somente com a parte da Thread
não dá para vericar, realmente, qual é o erro, o bom seria você colocar o método que altera as images
e o método, se existir, que inicializa essa função da thread. Poste esses códigos aqui.

[quote=WendersonLP]Bem, a imagem creio que você esteja guardando em um JLabel, assim somente com a parte da Thread
não dá para vericar, realmente, qual é o erro, o bom seria você colocar o método que altera as images
e o método, se existir, que inicializa essa função da thread. Poste esses códigos aqui.[/quote]
Cara…
É android… É diferente, não é jLabel…
Eu queria saber como fazer 1 thread, que não necessite de EventQueue
Eu já colokei a Thread para escrever uma contagem de 1 a 30 numa label…
Ele executa só 1 vez (de 1 vai para 2), e depois dá erro…
O erro é na thread mesmo…
Minha thread tá assim:

private class ClockRunnable implements Runnable { public void run() { try { while (true) { trocaimagem(); Thread.sleep(5000); } } catch (InterruptedException e) { } } }
Era pra ela rodar assim?

Bem, a sua thread está correta, mais a especificação da alteração das imagens, que deve ser feitas o endereço de cada,
ela é determinada por index, cada String guardando um determinado endereço?

O ERRO NAO TA NO trocaimagem();
Vou mostrar outro exemplo que não funciona a thread:

[code] private void lol(int i) {
tvimc.setText(String.valueOf(i));
}

private class ClockRunnable implements Runnable {
	public void run() {
		try {
			int i = 0;
			while (true) {
				lol(++i);
				Thread.sleep(6000);
			}
		} catch (InterruptedException e) {
		}
	}
}[/code]

O que acontece:
Quando executa, ele inicia a thread, e põe o valor 1 no tvimc…
Depois de 6 segundos (Thread dorme por 6 segundos), quando era para ele continuar a thread, ele trava…
O problema ta na Thread…
Axo que a ela precisava disso:

EventQueue.invokeLater(new Runnable() { public void run() { } });

Sua Thread realmente está correta. Onde você a inicia? Poste esse trecho.

Inicio ela depois de instanciar os componentes…
Assim:

Thread minhathread = new Thread(new ClockRunnable(), "MinhaThread"); minhathread.start();

No quesito Java, seu código está certo. Será que há alguma diferença no funcionamento de Thread no Android?

Deve ser então
que bosta ! =/
Eu ja criei uns 4 tópicos no forum do android, mas é 1 bosta lah…
Nada comparado ao guj…
Criei o tópico faz 4 dias, e não tive nenhuma resposta…
Aki no guj de 1 em 1 minuto alguem responde =P

[quote=pedroroxd]Deve ser então
que bosta ! =/
Eu ja criei uns 4 tópicos no forum do android, mas é 1 bosta lah…
Nada comparado ao guj…
Criei o tópico faz 4 dias, e não tive nenhuma resposta…
Aki no guj de 1 em 1 minuto alguem responde =P[/quote]
Isso é verdade! :smiley:

Oi,

1º Não utilize while(true); Sempre use while(!Thread.isInterrupted())
2º Tratar a exceção InterruptedException mesmo que for apenas para mostra-la (ex.printStack).
3º Se for o caso, crie um try tratando apenas Exception! pois algo de estranho está acontecendo…

Tchauzin!

[quote=lina]Oi,

1º Não utilize while(true); Sempre use while(!Thread.isInterrupted())
2º Tratar a exceção InterruptedException mesmo que for apenas para mostra-la (ex.printStack).
3º Se for o caso, crie um try tratando apenas Exception! pois algo de estranho está acontecendo…

Tchauzin![/quote]
Em android não existe
while(!Thread.isInterrupted())
Existe
while(!Thread.interrupted())
serve também?

Otra coisa que percebi agora…
A primeira imagem, é 1 imagem da minha instituição…
A segunda é 1 imagem de java
A terceira é de ubuntu…
A quarta é do eclipse…

Quando ele xega na do java, ele dá pau…
Mas se eu não clicar no botão “Force Close” imediatamente, ele ainda muda para a imagem do ubuntu…
Mas fica a tela do erro ainda…
Ae tem que clicar no “Force Close”

Fiz o que a lina sugeriu…
Tá assim:

public class ClockRunnable implements Runnable { public void run() { try { while(!Thread.interrupted()) { trocaimagem(); Thread.sleep(2000); } } catch (InterruptedException e) { try { e.printStackTrace(); showDialog(1); //método que eu criei que mostra 1 mensagem escrito "ERROR" } catch (Exception e2) { } } } }
Mas ele não printa nada, e não mostra a mensagem do erro…
Já tentei sem ser dentro desse outro trycatch, mas mesmo assim não acontece nada…
O programa trava, e não printa, e não mostra o dialog…

Olha o que eu achei:
http://novatec.com.br/livros/googleand/sumario9788575221860.pdf

É 1 .pdf que serve de sumário…
E 1 dos tópicos é:
13.8 Não utilize o Thread.sleep(ms)!.. 338

Só que não fala o que tem que fazer…
É só 1 sumário…
Que RAIVA!

Olha só o que encontrei: http://developer.android.com/guide/practices/design/responsiveness.html

Em um dos trechos diz:

Ou seja, tarefas longas em Threads separadas e a Thread principal não deve ficar travada esperando outras terminarem sua tarefa.

Parece que ao dizer “Não utilize o Thread.sleep(ms)!” ele se referia a fazer isso na Thread principal.

[quote=pedroroxd][quote=lina]Oi,

1º Não utilize while(true); Sempre use while(!Thread.isInterrupted())
2º Tratar a exceção InterruptedException mesmo que for apenas para mostra-la (ex.printStack).
3º Se for o caso, crie um try tratando apenas Exception! pois algo de estranho está acontecendo…

Tchauzin![/quote]
Em android não existe
while(!Thread.isInterrupted())
Existe
while(!Thread.interrupted())
serve também?[/quote]

Oi,

Serve sim! Estou sem compilador aqui… por isso respondi assim…

Tchauzin!

resumindo:
Tou ferrado!

O forum do android é 1 bosta… Ninguém ajuda…
Aki é mais para java msmo…
kkkkkk

Mas vlw ae
Vo continuar pesquisando…
COmo a tecnologia é relativamente “nova”, tá dificil de achar algum exempo com thread…

Consegui resolver…
Thread.sleep não funciona em android!

para alguem que tenha a mesma dúvida, ficou assim:

final Handler handler = new Handler(); Timer t = new Timer(); t.schedule(new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { trocaimagem(); // fazer alguma coisa } }); } }, 1, 3000); //3000 ms = 3 segundos

[quote=pedroroxd]Consegui resolver…
Thread.sleep não funciona em android!

para alguem que tenha a mesma dúvida, ficou assim:

final Handler handler = new Handler(); Timer t = new Timer(); t.schedule(new TimerTask() { public void run() { handler.post(new Runnable() { public void run() { trocaimagem(); // fazer alguma coisa } }); } }, 1, 3000); //3000 ms = 3 segundos[/quote]
TimerTask… bem pensado, já que Thread.sleep() não funciona ( :? ).