Temporizador de TextView de Android

Para mi aplicación de Android hay un temporizador que mide cuánto tiempo ha pasado. Cada 100 milisegundos actualizo mi TextView con algún texto como "Score: 10 Time: 100.10 seconds". Pero, creo que TextView sólo se actualiza las primeras veces. La aplicación sigue siendo muy sensible, pero la etiqueta no se actualizará. Intenté llamar a .invalidate (), pero todavía no funciona. No sé si hay alguna manera de arreglar esto, o un widget mejor para usar.

He aquí un ejemplo de mi código:

float seconds; java.util.Timer gametimer; void updatecount() { TextView t = (TextView)findViewById(R.id.topscore); t.setText("Score: 10 - Time: "+seconds+" seconds"); t.postInvalidate(); } public void onCreate(Bundle sis) { ... Load the UI, etc... gametimer.schedule(new TimerTask() { public void run() { seconds+=0.1; updatecount(); } }, 100, 100); } 

La solución general es usar android.os.Handler en su lugar que se ejecuta en el subproceso de interfaz de usuario. Sólo realiza devoluciones de un solo disparo, por lo que debe activarla de nuevo cada vez que se llame. Pero es bastante fácil de usar. Un blog en este tema fue escrito hace un par de años:

http://android-developers.blogspot.com/2007/11/stitch-in-time.html

Lo que creo que está sucediendo es que te estás cayendo del hilo de la interfaz de usuario. Hay un solo hilo "looper" que maneja todas las actualizaciones de la pantalla. Si intenta llamar a "invalidate ()" y no está en este hilo, nada pasará.

Intente usar "postInvalidate ()" en su vista. Le permitirá actualizar una vista cuando no esté en el subproceso de interfaz de usuario actual.

Más información aquí

Utilizar código inferior para establecer la hora en TextView

 public class MyCountDownTimer extends CountDownTimer { public MyCountDownTimer(long startTime, long interval) { super(startTime, interval); } @Override public void onFinish() { ExamActivity.this.submitresult(); } @Override public void onTick(long millisUntilFinished) { long millis = millisUntilFinished; int seconds = (int) (millis / 1000) % 60; int minutes = (int) ((millis / (1000 * 60)) % 60); int hours = (int) ((millis / (1000 * 60`enter code here` * 60)) % 24); String ms = String .format("%02d:%02d:%02d", hours, minutes, seconds); txtimedisplay.setText(ms); } } 

Hay una manera más de cambiar el texto cada segundo; Esto es ValueAnimator . Aquí está mi solución:

  long startTime = System.currentTimeMillis(); ValueAnimator animator = new ValueAnimator(); animator.setObjectValues(0, 1000); animator.setDuration(1000); animator.setRepeatCount(ValueAnimator.INFINITE); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { long currentTime = System.currentTimeMillis(); String text = TimeFormatUtils.formatTime(startTime - currentTime); yourTextView.setText(text); } @Override public void onAnimationRepeat(Animator animation) { long currentTime = System.currentTimeMillis(); String text = TimeFormatUtils.formatTime(startTime - currentTime); yourTextView.setText(text); } }); animator.start(); 
  • Cómo implementar una animación creciente de 0 a 600 en 5 segundos en TextVIew en android
  • Android: TextView: elimina el espaciado y el relleno en la parte superior e inferior
  • Escala automática TextView Text para ajustar dentro de límites
  • Fuente urdu en la vista de texto
  • Establecer texto en TextView utilizando Html.fromHtml
  • Android: sólo cambia el texto de la TextView alfa
  • Actualización de la actividad TextView desde el servicio mediante vinculación de servicio
  • Para dibujar un subrayado debajo de TextView en Android
  • Problema de superposición de texto en ViewFlipper ..
  • TextView redimensionado para ajustarse al texto
  • Android: la aplicación se bloquea al iniciar una nueva actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.