Вопрос

В моем приложении для Android есть таймер, который измеряет, сколько времени прошло.Каждые 100 миллисекунд я обновляю свой TextView текстом типа «Оценка:10 Время:100,10 секунды».Но я считаю, что TextView обновляется только первые несколько раз.Приложение по-прежнему очень отзывчиво, но ярлык не обновляется.Я попытался вызвать .invalidate(), но он все равно не работает.Я не знаю, есть ли способ это исправить или использовать виджет получше.

Вот пример моего кода:

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);
}
Это было полезно?

Решение

Общее решение — использовать вместо этого android.os.Handler, который запускается в потоке пользовательского интерфейса.Он выполняет только однократные обратные вызовы, поэтому вам придется запускать его снова каждый раз, когда вызывается обратный вызов.Но он достаточно прост в использовании.Сообщение в блоге на эту тему было написано пару лет назад:

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

Другие советы

Я думаю, что происходит то, что вы выпадаете из потока пользовательского интерфейса.Существует единственный поток «петли», который обрабатывает все обновления экрана.Если вы попытаетесь вызвать «invalidate()», но вас нет в этом потоке, ничего не произойдет.

Вместо этого попробуйте использовать «postInvalidate()» в своем представлении.Это позволит вам обновить представление, когда вы не находитесь в текущем потоке пользовательского интерфейса.

Больше информации здесь

Используйте код ниже, чтобы установить время в 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);
        }
    }

Есть еще один способ менять текст каждую секунду;Это ValueAnimator.Вот мое решение:

  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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top