2015-02-18 2 views
0

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

ответ

0

добавить

seconds.invalidate(); 
secondsTotal.invalidate(); 

после вызовов при изменении значения Вероятно, происходит то, что текстовые значения (в минутах) короче, чем существующие ng в представлении, чтобы он заставил макет произойти.

+1

Это не имеет никакого эффекта. Я считаю, что метод setText также приведет к аннулированию представления в любом случае –

+0

ok .. вы правы. setText() вызовет invalidate(), но пытается оптимизировать вызов requestLayout() в зависимости от того, изменилась ли ширина и/или высота. – dangVarmit

Смежные вопросы