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(); 
  • Creación de la caja de conmutación onClickListener para TextView
  • Copiar texto de TextView en Android
  • Desplazamiento horizontal automático de Android TextView
  • Html.fromHtml no funciona para span
  • Centrar el contenido de TextView vertical y horizontalmente - LinearLayout
  • Padding arround textview con fondo de nueve parches no tienen efecto visual
  • ¿Hay una manera de hacer ellipsize = "marquee" siempre desplazarse?
  • Reemplazar el dígito inglés con el dígito persa en Cadena, excepto las URL
  • Android Enlaza tanto web como @mentions todas en el mismo TextView
  • IllegalArgumentException al seleccionar texto en Android TextView
  • Cómo configurar la cadena de respuesta JSON formateada en un TextView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.