Frage

Für meine Android-Anwendung gibt es einen Timer, der misst, wie viel Zeit vergangen ist. Je 100 Millisekunden ich meine Textview mit etwas Text wie aktualisieren „Score: 10 Zeit: 100,10 Sekunden“. Aber finde ich die Textview aktualisiert nur die ersten paar Male. Die Anwendung ist immer noch sehr reaktionsschnell, aber das Etikett wird nicht aktualisiert. Ich versuchte zu rufen .invalidate (), aber es funktioniert immer noch nicht. Ich weiß nicht, ob es eine Möglichkeit ist, dies zu beheben, oder ein besseres Widget zu verwenden.

Hier ist ein Beispiel für meinen Code:

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);
}
War es hilfreich?

Lösung

Die allgemeine Lösung ist android.os.Handler stattdessen zu verwenden, die in dem UI-Thread ausgeführt wird. Es tut nur One-Shot-Rückrufe, so muss man es auslösen wieder jedes Mal, wenn Ihr Rückruf aufgerufen wird. Aber es ist leicht genug, um zu verwenden. Ein Blog-Post zu diesem Thema ein paar Jahren geschrieben wurde vor:

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

Andere Tipps

Was ich denke, geschieht, ist Sie das UI-Thread sind herunterfallen. Es gibt einen einzigen „Looper“ Threads, alle Bildschirm-Updates behandelt. Wenn Sie versuchen, „ungültig machen ()“ zu nennen, und du bist nicht auf diesen Thread nichts passieren wird.

Versuchen "postInvalidate ()" auf Ihrer Ansicht stattdessen verwenden. Es lasse Sie eine Ansicht aktualisieren, wenn Sie nicht in dem aktuellen UI-Thread sind.

Weitere Informationen hier

Verwenden Sie den folgenden Code einstellen Zeit auf 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);
        }
    }

Es gibt eine weitere Möglichkeit, Text in jeder Sekunde zu ändern; dies ist ValueAnimator. Hier ist meine Lösung:

  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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top