Таймер Android TextView - PullRequest
       23

Таймер Android TextView

17 голосов
/ 07 февраля 2009

Для моего приложения для 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);
}

Ответы [ 4 ]

18 голосов
/ 26 ноября 2009

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

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

2 голосов
/ 07 февраля 2009

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

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

Подробнее здесь

1 голос
/ 19 декабря 2014

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

Существует еще один способ изменять текст каждую секунду; это 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...