Mostrando postagens com marcador Thread. Mostrar todas as postagens
Mostrando postagens com marcador Thread. Mostrar todas as postagens

segunda-feira, 30 de abril de 2012

Executando tarefas sequencialmente em outra Thread no Android

 Este post exemplifica uma necessidade que às vezes ocorre em um projeto: executar uma série de tarefas sequencialmente em uma thread.
 Para fazer isso temos um recurso em Java que atende perfeitamente ao requisito acima: a estrutura Executor. Um executor é basicamente um gerenciador de threads e tarefas.
 O exemplo consiste em executar uma série de tarefas numa única thread que é controlada por um executor. A tarefa vai ser representada por uma classe que vai implementar um Runnable (MyTask). Para não ficar invisível vamos atualizar a tela com o Dialog.
 Vamos também usar uma outra thread para definir o Executor e submeter as tarefas para execução e aguardar até o fim de todas as tarefas para encerrar o Dialog ( MyControlThread).

 Os códigos:
 TesteExecutorsActivity.java


main.xml



Manifest file


PS: Algumas considerações sobre o código: No trecho abaixo, devemos observar o seguinte:
 a. O executor é definido com uma thread para podermos executar as tarefas sequencialmente uma a uma.
b. O loop for é para simular a submissão de "n" tarefas, normalmente teríamos diversas tarefas diferentes sendo submetidas da seguinte forma:
PS1: Nas tarefas, o Handler é utilizado para executar algum código na UI Thread, normalmente para alterar a tela.

 Executando no emulador:


quinta-feira, 9 de fevereiro de 2012

Thread, Handler, Runnable e ProgressDialog - Ex02


Neste outro teste vamos simular uma operação demorada e mostrar a evolução do processamento através de um ProgressDialog com uma barra indicadora de progresso.

Alguns detalhes da implementação:
  No onClick() do botão eu chamo o método ativaThread() que faz duas coisas: primeiro prepara o ProgressDialog e segundo prepara a thread e a starta.
  Na thread fazemos uma contagem de 0 a 100 e a cada iteração enviamos uma atualização da barra de progresso, como estamos em uma thread que não a UI Thread usamos o handler-runnable para isso.
  Quando a contagem chega a 100, mudamos o status para concluído e setamos o status da thread para interrupted. (Só para não ficar parado no sleep).
   No final, antes de sair da thread o ProgressDialog é fechado e enviamos uma breve mensagem via toast.

Seguem os códigos.







Vejam a app em execução:



Bons códigos!

PS: Alterei a variável total para volatile, pois ela é acessada por duas threads.



quarta-feira, 8 de fevereiro de 2012

Thread, Handler, Runnable e ProgressDialog - Ex01

Neste teste vamos simular uma operação demorada com tempo indeterminado para terminar.
Como é uma operação demorada a regra número 1 nos diz para não bloquear a UI Thread, então vamos implementar uma thread para fazer o serviço.
Como não podemos alterar a tela diretamente (regra nº 2) vamos usar um handler e um runnable para atualizar a tela estando em outra thread que não a UI Thread.

Alguns detalhes da implementação:
  Eu extendo a classe Thread e no construtor eu informo um inteiro que é o número de loops que vou fazer para simular uma operação demorada (cada loop demora aproximadamente 1 segundo).
  No método fazerAlgoDemorado(), é o local onde faríamos uma consulta a um servidor, baixariamos um arquivo, ou uma sequência longa de cálculos.
  Antes de iniciar a thread é mostrado o ProgressDialog para informar ao usuário que o app vai iniciar uma operação longa. No final, antes de sair da thread o ProgressDialog é fechado e enviamos uma breve mensagem via toast. E como estamos em outra thread, fazemos isso via handler-runnable.

Seguem os códigos.







Olhem o programa em execução:



Bons códigos!