Thread [RESOLVIDO]

19 respostas
pedroroxd

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

19 Respostas

pedroroxd

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.

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.

pedroroxd

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.

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?

WendersonLP

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?

pedroroxd
O ERRO NAO TA NO trocaimagem(); Vou mostrar outro exemplo que não funciona a thread:
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) {
			}
		}
	}
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() {  
                  }  
                  });
M

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

pedroroxd

Inicio ela depois de instanciar os componentes…
Assim:

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

M

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

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

M

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

Isso é verdade! :smiley:

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!

pedroroxd

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!</blockquote>

Em android não existe 				

while(!Thread.isInterrupted())

Existe

while(!Thread.interrupted()) 

serve também?
pedroroxd

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…

pedroroxd

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!

M

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.

lina

pedroroxd:
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!</blockquote>

Em android não existe 				

while(!Thread.isInterrupted())

Existe

while(!Thread.interrupted()) 

serve também?</blockquote>

Oi,

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

Tchauzin!

pedroroxd

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…

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

M

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


TimerTask… bem pensado, já que Thread.sleep() não funciona ( :? ).

Criado 17 de dezembro de 2009
Ultima resposta 20 de dez. de 2009
Respostas 19
Participantes 4