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