domingo, 14 de julho de 2013

Sincronizando ciclos de vida de uma work thread e da activity

 Para comemorar o aniversário do Blog Agorandroid, como um presente especial para os leitores, segue um exemplo de código que uso em algumas situações.
 Muitas vezes temos a necessidade de executar uma tarefa em segundo plano de uma forma contínua, ficando em loop enquanto uma activity esteja sendo executada. Mas, com uma característica adicional: desejamos sincronizar o ciclo de vida da tarefa com o ciclo de vida da activity.
 Para isso vamos definir uma classe MyTask que implementa a interface Runnable, e usar dois loops aninhados para controlar o ciclo de vida da tarefa. No loop externo, vamos usar a característica blocante da queue com bloqueio para aguardar/liberar a execução do serviço no loop interno.
 Implementamos os seguintes métodos do ciclo de vida da tarefa:
 -resume() - para (re)iniciar a tarefa;
 -pause() - para encerrar o loop interno;
 -stop() - para encerrar a tarefa;
 E os métodos auxiliares para setar/checar o status da tarefa: setStatus() e isRunning().
 O método doSomething() representa o serviço a ser executado pela tarefa, no caso, apenas incrementamos um contador e usamos o handler para atualizar a tela.

 Na activity, implementamos os seguintes métodos:
 -onCreate - instanciamos o textView e o button, e colocamos código para pausar/reiniciar a contagem da tarefa;
 -onStart - instanciamos a tarefa, a thread e startamos a thread;
 -onResume - chamamos o método resume da tarefa;
 -onPause - chamamos o método pause da tarefa;
 -onStop - chamamos o método stop da tarefa e esperamos a finalização da thread.

 Notem que o objetivo é manter a tarefa ativa somente quando a activity estiver no status "resumed".

 Seguem os códigos:

main.xml


TesteThread5Activity.class


O código está cheio de Log´s para podermos acompanhar a execução dos métodos.

Vejam um teste que executei:



Espero que gostem,

 Abraços

Nenhum comentário:

Postar um comentário