Ver mensagens sem resposta | Ver tópicos ativos Hoje é 15 Set 2019, 23:43



Responder Tópico  [ 1 Mensagem ] 
 Usando o Handler como Timer, CountUpTimer 
Autor Mensagem
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Usando o Handler como Timer, CountUpTimer
No Android, sempre que pensamos em alguma rotina baseada em tempo, a indicação é usar a classe Handler. Mesmo que o primeiro recurso que lembrarmos seja a classe Timer!
A classe Handler possui esses métodos que são úteis para implementar comportamentos baseados em tempo: postAtTime, postDelayed, sendMessageAtTime e sendMessageDelayed.
Nesse exemplo uso uma classe abstrata CountUpTimer, que foi inspirada na CountDownTimer, para implementar um jeito de executar tarefas repetitivas após um dado intervalo de tempo.
Toda a lógica está no método handleMessage do Handler, o método que se deve implementar ao extender o CountUpTime é o onTick, que recebe o tempo decorrido desde o start em milisegundos.
Notem que o onTick deve ser implementado com o cuidado de ser breve, e, com uma preocupação adicional, de estar sendo chamado em um bloco sincronizado.

Como costumam dizer por aí que uma imagem vale por mil palavras, eu acho que um código vale pelo menos por umas tantas quantas... Então seguem os códigos:

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

/*
 *       @author A H Gusukuma
 *       agorandroid.blogspot.com
 */

public abstract class CountUpTimer {

 private static final int MSG = 1;
 private final long mCountupInterval;

 private long mMillisStart;
 private long mMillisLast;
 private boolean mCancelled = false;

 public CountUpTimer(long countupInterval) {
  mCountupInterval = countupInterval;
 }

 public synchronized final void cancel() {
  mCancelled = true;
  mHandler.removeMessages(MSG);
 }

 public synchronized final CountUpTimer start() {
  mCancelled = false;
  mMillisStart = mMillisLast = SystemClock.elapsedRealtime();
  mHandler.sendMessage(mHandler.obtainMessage(MSG));
  return this;
 }

 public abstract void onTick(long millisElapsed);

 // handler
 @SuppressLint("HandlerLeak")
 private Handler mHandler = new Handler() {

  @Override
  public void handleMessage(Message msg) {

   synchronized (CountUpTimer.this) {
    final long elapsedRealtime = SystemClock.elapsedRealtime();
    if (mCancelled) {
     return;
    }

    final long millisElapsed = elapsedRealtime - mMillisStart;
    final long millisLastInterval = elapsedRealtime - mMillisLast;
    if (millisLastInterval < mCountupInterval) {
     sendMessageDelayed(obtainMessage(MSG), mCountupInterval
       - millisLastInterval);
    } else {
     mMillisLast = elapsedRealtime;

     onTick(millisElapsed);

     // calcula o tempo para executar o onTick
     long millisDelay = mMillisLast + mCountupInterval
       - SystemClock.elapsedRealtime();

     // ajusta para o próximo intervalo (se onTick demorou mais
     // que mCountupInterval)
     while (millisDelay < 0) {
      millisDelay += mCountupInterval;
     }

     sendMessageDelayed(obtainMessage(MSG), mCountupInterval
       - millisDelay);
    }
   }
  }
 };
}
 



// defina essas variáveis em nível de Activity
       CountUpTimer countupTimer;
       long countUp;
...

 final TextView tv1 = (TextView) findViewById(R.id.tv1);
        final long UM_SEGUNDO = 1000;
       
  countupTimer = new CountUpTimer(UM_SEGUNDO) {
   @Override
   public void onTick(long millisElapsed) {
    countUp = (millisElapsed) / 1000;
    String asText = (countUp / 60) + ":"
      + ((countUp % 60) < 10 ? "0" : "") + (countUp % 60);
    tv1.setText(asText);
   }
  }.start();
 

Uma observação final, implemente o CountUpTimer na MainThread.

Postei um exemplo de uso: http://agorandroid.blogspot.com.br/2015 ... lador.html

O vídeo não ficou muito bom (perdeu resolução ao publicar), mas dá para ter uma idea do funcionamento da classe no emulador.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


23 Mar 2015, 12:22
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 1 Mensagem ] 

Quem está online

Usuários vendo este fórum: adenilsonsena, AdrianoMM, alexcost2002, Andre Brito, andreluzz, Antonio Carlos, arkanjo, berchielli, brunomalka, C0GuM3I0, caliow, Captain Typho, Carlos, carlosavasconcelos, cezaraf, cleber, cleberkct, Costa, Darth Sidious, Delão, Dirceu W. C. Conte, dkclan, drjunior, e-azuos, edlinux, eXagon, fcoroa, Felipe Marcondes, FelipeOliveira, fernandofsf, fgalvão, Flavio, flaviohssantos, flaviojps, flaviolemos, fracon, frankmendes, frederico.affini, Gui Pereira, gusrp, henrique.garcia, hostdesigner, jhonguitar, Josinhaz, Julio Assis, klyff, lafamac, laurj, leandroviana, leeeeooooooo, leoadias, Leonardo333, leonardodamata, lhdiassilva, Lord, luiz, luiz.lago, m4v0, Mace Windu, madeinnordeste, marcelochiquinho, marcelorferrari, Marco Magoo, marcosandreao, marcosf63, marinho5, mayahaslinger, mendes_lu, mikasjau, mmfsndroid, neiesc, neimarguerra, Nidio Dolfini, nino, nocivus, nq6, pabarbosa, paulo.esantos, pbcjunior, peixe, pfsmorigo, piantino, PicsearchDroid, Princesa Léia Organa, Rainha Amidala/Padmé, romualdo, romulotales, Samuka, sergio, shazaum, sidnei.gs, Silvio Vaz, slackware, snonca, Synoo [Bot], Tangerina, Thelemita, vanmars, Vector, viniciusluiz, voliverio, washington, wil, Wryel, wylken, Yoshihury, yuri82, zaquiel e 5 visitantes


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi