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);
}
¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top