Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

timer preciso

Parece que o grande mestre voltou :), então vou colocar aqui o problema, e pra quem ta começando já vai aprendendo. Temos o seguinte código : Preciso de um Timer que vai decrementando, logo temos o código abaixo:

private void Timer() {
    Handler meuHandler=new Handler();
    long controleContagem=10000;
    TextView texto=findViewById(R.id.seuTextView);
    meuHandler.post(new Runnable {
        if(controleContagem>0){
            int horas=(int)(controleContagem/1000)/3600;
                    int minutos=(int)(controleContagem/1000)%3600/60;
                    int segundos=(int)(controleContagem/1000)%60;
                    int milesimos=(int)controleContagem%1000;
                    String formato=String.format("%02d : %02d : %02d . %02d",horas,minutos,segundos,milesimos);
            texto.setText(formato);
            controleContagem--;
           meuHandler.post(this,1);
        }
    });
}

Nesse código seria uma solução porem ele na verdade foi feito pra repetir a cada 1 segundo e não 1 milésimo. O cronomêtro padão do Android tem precisão de 1 décimo e esse código não tem precisão nem de 1 centésimo. A função Timer do Java Util não executa no Android e não sei o porquê. Então a dúvida é essa, como faço um Timer decente no AndroidStudio???

3 respostas
solução!

Oi Marcelo, tudo bem? A documentação sobre tarefas em background recomenda que se você precisa de precisão na execução de alguma tarefa, você use a classe AlertManager: https://developer.android.com/guide/background

Claro, na documentação da classe AlarmManager, vai ter lá uma observação que se você precisa fazer timing, use a classe Handler normal.

Eu por outro lado, vendo o código que tem várias divisões e mods com casting, me faz pensar se na conta, não podemos ter arredondamentos e por causa disso a precisão seja prejudicada. Faz sentido?

obrigado por responder Wanderson, faria sentido fazer o que eu fiz se caso não tivesse nada (ou não conhecesse nada ) de classes sobre isso como foi ommeu caso, eu usei a classe Chronometer que é uma TextView que fica na tela mas dá para sobre escrever, é possível usar ela como uma listener para servir de clock que é mais precisa que o handler. A sua ideia de fazer no background na minha opinião é a unica solução viável pois sempre que você usa o ciclo de maquina para fazer temporizador todo código consome um ciclo de maquina.

Sim, faz sentido! Espero que dê certo dessa forma. :)