Android TextView Timer
Для моего приложения Android есть таймер, который измеряет, сколько времени прошло. Когда-либо 100 миллисекунд, я обновляю свой TextView с помощью некоторого текста, такого как "Score: 10 Time: 100.10 seconds". Но я обнаружил, что 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);
}
Ответы
Ответ 1
Общее решение заключается в том, чтобы вместо этого использовать android.os.Handler, который работает в потоке пользовательского интерфейса. Он выполняет только однократные обратные вызовы, поэтому вы должны запускать его снова каждый раз, когда вы вызываете обратный вызов. Но его достаточно просто использовать. Сообщение в блоге на эту тему было написано пару лет назад:
http://android-developers.blogspot.com/2007/11/stitch-in-time.html
Ответ 2
То, что я думаю, происходит, это то, что вы падаете из потока пользовательского интерфейса. Существует один поток "петлителя", который обрабатывает все обновления экрана. Если вы попытаетесь вызвать "invalidate()", и вы не находитесь в этой нити, ничего не произойдет.
Попробуйте вместо этого использовать "postInvalidate()". Это позволит вам обновить представление, если вы не находитесь в текущем потоке пользовательского интерфейса.
Подробнее здесь
Ответ 3
Используйте код ниже, чтобы установить время в 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);
}
}
Ответ 4
Есть еще один способ изменить текст каждую секунду; это 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();