Извините за неудобный заголовок, я не знал, как лучше описать свою проблему.TextView.setText блокируется до тех пор, пока расписание TimerAtFixedRate не завершится
У меня есть два textviews
на экране. Один textview
- это количество оставшихся секунд в минуту (так что всегда будет меньше 60, когда он достигнет 0, он начнется на 59), а другой textview
удерживает общее количество секунд, оставшихся в таймере (который начинается на число, которое может быть больше 60 и считать до 0 до остановки).
У меня есть кнопка, которая поменяет местами ссылки на эти TextViews
, так что текст, содержащий количество секунд, оставшихся в минуту, будет заменен текстом, на котором осталось общее количество оставшихся секунд, и наоборот. Кнопка можно щелкнуть несколько раз, чтобы значения могли меняться взад и вперед по мере выбора пользователем.
Странно то, что когда я устанавливаю текст, он мгновенно обновляет textviews
, когда я переключаюсь с одного направления на другой (от секунд до минут в секундах), но другое направление будет отложено и подождите, пока таймер scheduleAtFixedRate
завершит еще одну итерацию (когда-либо 1000 мс).
Очевидно, что я хочу, чтобы текст был заменен без задержки. Он работает только в одном направлении, но не в другом.
Вот код, я работаю с:
String totalSecs = secondsTotal.getText().toString();
String secsSecs = seconds.getText().toString();
//switch the TextView id's
//WORKS IMMEDIATELY
if (seconds.getId() == R.id.secondsTotal){
seconds = (TextView)findViewById(R.id.secondsLabel);
secondsTotal = (TextView)findViewById(R.id.secondsTotal);
seconds.setText(totalSecs);
secondsTotal.setText(secsSecs);
}
else{ //IS DELAYED UNTIL TIMER ITERATION
seconds = (TextView)findViewById(R.id.secondsTotal);
secondsTotal = (TextView)findViewById(R.id.secondsLabel);
seconds.setText(secsSecs);
secondsTotal.setText(totalSecs);
}
Мой Таймер выглядит так:
Timer t = new Timer();
//set the schedule function
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
startCountdown(); //for seconds left in minute
startCountdownTotal(); //for total seconds remaining
}
});
}
}, 0, 1000);
Это не имеет никакого эффекта. Я считаю, что метод setText также приведет к аннулированию представления в любом случае –
ok .. вы правы. setText() вызовет invalidate(), но пытается оптимизировать вызов requestLayout() в зависимости от того, изменилась ли ширина и/или высота. – dangVarmit