Таймер Blackberry не запускает TimerTask

#java #blackberry #timer

#java #ежевика #таймер

Вопрос:

Я пытаюсь использовать время, которое обновляет метку каждую секунду (поэтому он показывает обратный отсчет), но кажется, что оно «тикает» только один раз, и я не могу понять, что я делаю неправильно!

    public class Puzzle extends UiApplication {

public static void main(String[] args) {
    Puzzle puzzle = new Puzzle();
    puzzle.enterEventDispatcher();

}

public Puzzle() {


     pushScreen(new PuzzleScreen());
}

}

class PuzzleScreen extends MainScreen {
LabelField timerLabel;
Timer timer;
public static int COUNT = 0;

public PuzzleScreen() {

    //set up puzzle

    VerticalFieldManager vfm = new VerticalFieldManager();
    add(vfm);
    timerLabel = new LabelField();
    timerLabel.setText("00:20");
    vfm.add(timerLabel);

    StartTimer();

}

void StartTimer() {
    timer = new Timer();
    timer.schedule(new TimerTick(), 1000);
}
private class TimerTick extends TimerTask {

    public void run() {

        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {

                timerLabel.setText((COUNT  )   "");
            }

        });
    }
}
  

Кто-нибудь может увидеть, что я делаю неправильно ..? Все, что происходит, — это то, что для моей метки get установлено значение «0», а затем не изменяется. Я установил точку останова при запуске в классе timer tick, но я не вижу, чтобы она срабатывала!

Bex

Ответ №1:

Вам нужно будет изменить вызов функции schedule () вашего таймера на

 timer.schedule(new TimerTick(), 0, 1000);
  

То, как вы вызываете это прямо сейчас, говорит о том, чтобы запустить его один раз после секундной задержки. Этот способ говорит о необходимости запускать его сейчас и каждую секунду. Вы, вероятно, хотите использовать

 timer.scheduleAtFixedRate(new TimerTick(), 0, 1000); 
  

хотя, потому что это гарантирует, что в среднем ваша TimerTask выполняется каждую секунду, а не при обычном вызове schedule (), который говорит, что попытается подождать секунду, а затем выполнить, но он может отстать, если что-то замедлит его. Если scheduleAtFixedRate () задерживается, он выполнит несколько вызовов быстрее, чем с задержкой в 1 секунду, чтобы он мог «наверстать упущенное». Взгляните на http://www.blackberry.com/developers/docs/5.0.0api/java/util/Timer.html#scheduleAtFixedRate(java.util.TimerTask, long, long) для более подробного объяснения.

Комментарии:

1. как только вы опубликовали, что он щелкнул!! Ага! Новичок в Java и пропускаю мои биты c #!! Спасибо!

2. @jprofitt, я хочу вызвать свой метод только один раз, так что это будет инструкция? таймер.расписание(новый TimerTick(), 1000);