Como ligar temporizador
Aplicação de cronômetro
Porque você está usando setTimeout() ou setInterval(). Eles não podem ser confiáveis, não há garantias de precisão para eles. Eles podem atrasar arbitrariamente, e não mantêm um ritmo constante, mas tendem a se desviar (como você observou).
Agora, isso tem o problema de possivelmente saltar valores. Quando o intervalo se atrasa um pouco e executa sua chamada de retorno após 990, 1993, 2996, 3999, 5002 milissegundos, você verá a segunda contagem 0, 1, 2, 3, 5 (!). Portanto, seria aconselhável atualizar com mais freqüência, como a cada 100ms, para evitar tais saltos.
No entanto, às vezes você realmente precisa de um intervalo constante executando suas rechamadas sem desvios. Isto requer uma estratégia (e um código) um pouco mais avançado, embora pague bem (e registre menos tempo de espera). Estes são conhecidos como temporizadores auto-ajustáveis. Aqui o atraso exato para cada um dos intervalos repetidos é adaptado ao tempo realmente decorrido, em comparação com os intervalos esperados:
Vou apenas construir sobre a resposta de Bergi (especificamente a segunda parte) um pouco porque realmente gostei da maneira como foi feito, mas quero a opção de parar o timer uma vez que ele comece (como clearInterval() quase). Sooo… Eu o envolvi em uma função de construtor para que possamos fazer coisas ‘objetivas’ com ele.
Cronômetro
Isenção de responsabilidade: Esta não é a solução ideal. Esta é a solução utilizando a classe Timer (como solicitado pela OP). No Android SDK, é recomendado o uso da classe Handler (há exemplo na resposta aceita).
A forma sugerida oficialmente é usar o ScheduledThreadPoolExecutor, que é mais eficaz e rico em recursos – que podem, adicionalmente, agendar comandos para serem executados após um determinado atraso, ou para serem executados periodicamente. Além disso, ele dá flexibilidade e capacidades adicionais ao ThreadPoolExecutor.
Coloque o seguinte código em sua Atividade, e o método tick() será chamado a cada segundo no tópico UI enquanto sua atividade estiver no estado “retomada”. Naturalmente, você pode mudar o método tick() para fazer o que quiser, ou para ser chamado com mais ou menos freqüência.
Você precisa criar um tópico para lidar com o loop de atualização e usá-lo para atualizar a área de texto. A parte complicada é que somente a linha principal pode modificar o ui, então a linha do laço de atualização precisa sinalizar a linha principal para fazer a atualização. Isto é feito usando um Handler.
Tenho um temporizador definido?
Tutorial CountDownTimer com exemplo no Android StudioCountDownTimer no Android é usado para definir uma contagem regressiva com base no intervalo definido por você e ela vai parar quando chegar a hora no futuro. Você pode usar este Count Down Timer para criar qualquer contagem regressiva para eventos.
Exemplo: No exemplo abaixo do temporizador de contagem regressiva, mostraremos a você o uso do temporizador de contagem regressiva em nossa aplicação. Para isso, exibimos uma visualização de texto e um botão em nosso arquivo xml. Na classe java, usamos os métodos do temporizador de contagem regressiva e adicionamos uma mensagem quando o temporizador termina. Aqui tínhamos definido o tempo e até aquele tempo especificado o timer funcionará e então parará. Abaixo está a saída final, download do código do projeto e explicação passo a passo:
Neste passo abrimos MainActivity onde adicionamos o código para iniciar a contagem regressiva do timer e uma visualização de texto para exibir o tempo e então o usuário pode exibir a mensagem de que o tempo acabou usando um Brinde e também exibido na visualização de texto.
Dica de bônus: Você também pode executar a contagem regressiva em ordem decrescente. Para isso, basta definir o valor final em uma variável (contador) e depois defini-lo como contador. Ela iniciará a contagem regressiva a partir do valor final.
Cronômetro do google
Uma vez iniciado, um cronômetro mede o intervalo atual, em tiquetaques temporizados decorridos, até que a instância seja parada ou reiniciada. Iniciar um Cronômetro que já está em funcionamento não altera o estado do timer ou zera as propriedades do tempo decorrido.
Quando uma instância de Cronômetro mede mais de um intervalo, o método Iniciar retoma a medição do tempo a partir do valor do tempo decorrido atual. Uma instância de Cronômetro calcula e retém o tempo decorrido acumulado em múltiplos intervalos de tempo, até que a instância seja reinicializada. Use o método Reset antes de chamar Start para limpar o tempo decorrido acumulado em uma instância de Cronômetro. Use o método Reiniciar para reiniciar e iniciar o cronômetro com um único comando.
