Domanda

Per la mia applicazione Android c'è un timer che misura quanto tempo è passato. Mai 100 millisecondi aggiorno il mio TextView con un testo come "Punteggio: 10 Tempo: 100.10 secondi". Ma, trovo il TextView aggiorna solo le prime volte. L'applicazione è ancora molto sensibile, ma l'etichetta non aggiornerà. Ho provato a chiamare .invalidate (), ma ancora non funziona. Non so se c'è un modo per risolvere questo problema, o un widget meglio utilizzare.

Ecco un esempio del mio codice:

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);
}
È stato utile?

Soluzione

La soluzione generale è quella di utilizzare android.os.Handler invece che corre nel thread UI. Lo fa solo callback one-shot, in modo da avere per far scattare di nuovo ogni volta che il callback viene chiamata. Ma è abbastanza facile da usare. Un post sul blog su questo argomento è stato scritto un paio di anni fa:

http://android-developers.blogspot.com/ 2007/11 / punto-a-time.html

Altri suggerimenti

Quello che penso che sta accadendo è che stai cadere il thread dell'interfaccia utente. C'è un unico filo "crochet", che gestisce tutti gli aggiornamenti dello schermo. Se si tenta di chiamare "invalidate ()" e non sei in questa discussione non accadrà nulla.

Prova a usare "postInvalidate ()" a vostra vista, invece. E lascerò aggiorna una visualizzazione quando non si è nel thread dell'interfaccia utente corrente.

Più informazioni qui

Usa Di seguito il codice per impostare il tempo sul 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);
        }
    }

C'è un altro modo per cambiare il testo ogni secondo; questo è ValueAnimator. Qui è la mia soluzione:

  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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top