2009-02-07 18 views
17

Para mi aplicación Android, hay un temporizador que mide cuánto tiempo ha pasado. Cada 100 milisegundos actualizo mi TextView con texto como "Puntuación: 10 veces: 100.10 segundos". Pero, me parece que el TextView solo se actualiza las primeras veces. La aplicación sigue siendo muy receptiva, 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 mejor widget para usar.Android TextView Timer

Aquí está 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); 
} 

Respuesta

18

La solución general es utilizar android.os.Handler vez que se ejecuta en el hilo de interfaz de usuario. Solo realiza devoluciones de llamadas de un solo disparo, por lo que debe volver a activarlo cada vez que se llame. Pero es bastante fácil de usar. Una entrada de blog sobre este tema fue escrito hace un par de años:

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

+0

Gracias por este enlace. El código en esa página funcionó perfectamente con mi temporizador basado en TextView. – RyanM

2

Lo que creo que está pasando es que está cayendo fuera el hilo de interfaz de usuario. Hay un único hilo "looper" que maneja todas las actualizaciones de pantalla. Si intentas llamar a "invalidate()" y no estás en este hilo, no pasará nada.

Intente utilizar "postInvalidate()" en su vista en su lugar. Te permitirá actualizar una vista cuando no estés en el hilo de UI actual.

Más información here

+0

Todavía no funciona - se actualiza la primera vez, así que sé que está funcionando pero no se actualiza después de eso. Gracias de todos modos, Isaac. –

+0

si quieres publicar un código snippit voy a echar un vistazo – haseman

+0

Agregué un código de ejemplo a mi publicación, ¡gracias! –

0

Uso continuación código para establecer el tiempo de Vista de Texto

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); 
     } 
    } 
0

Hay otra manera 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();