Android TextView temporizador
Pregunta
Para mi aplicación Android hay un temporizador que mide cuánto tiempo ha pasado. 100 milisegundos cada vez que se actualiza el TextView con un texto como "Puntuación: 10 Hora: 100,10 segundos". Sin embargo, creo que el TextView sólo actualiza las primeras veces. La aplicación sigue siendo muy sensible, pero la etiqueta no se actualizará. Traté de llamar .invalidate (), pero todavía no funciona. No sé si hay alguna manera de solucionar este problema, o una mejor widget a utilizar.
Este es 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);
}
Solución
La solución general es utilizar android.os.Handler vez que se ejecuta en el hilo de interfaz de usuario. Sólo hace devoluciones de llamada de un solo disparo, así que hay que activar de nuevo cada vez que su devolución de llamada. Sin embargo, 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 / coser-en-time.html
Otros consejos
Lo que creo que está pasando es que está cayendo fuera el hilo de interfaz de usuario. Hay un solo hilo "looper", que se ocupa de todas las actualizaciones de pantalla. Si intenta llamar "invalidar ()" y no estás en este hilo que va a pasar nada.
Trate de usar "postInvalidate ()" en la vista en su lugar. Se dejará que se actualiza una vista cuando no estás en el hilo de interfaz de usuario actual.
Más información aquí
A continuación Uso de código para configurar la hora 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);
}
}
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();