Реализация секундомера Blackberry - PullRequest
2 голосов
/ 09 марта 2010

Я пытаюсь написать приложение для ежевики, которое по сути является секундомером и отображает время прохождения круга. Во-первых, я не уверен, что реализую функциональность секундомера наиболее оптимальным способом. У меня есть LabelField (_myLabel), который отображает «часы» - начиная с 00:00. Затем вы нажимаете кнопку «Пуск», и каждую секунду поле _myLabel обновляется с учетом того, сколько секунд прошло с момента последнего обновления (должно увеличиваться только на 1, но иногда возникает задержка, и она пропускает число). Я просто не могу придумать другой способ сделать это - и я новичок в разработке GUI и потоков, поэтому я думаю, именно поэтому.

РЕДАКТИРОВАТЬ: Вот что вызывает секундомер:

_timer = new Timer();
_timer.schedule(new MyTimerTask(), 250, 250);  

А вот и TimerTask:

class MyTimerTask extends TimerTask {
long currentTime;
long startTime = System.currentTimeMillis();

public void run() {
synchronized (Application.getEventLock()) {
currentTime = System.currentTimeMillis();
long diff = currentTime - startTime;
long min = diff / 60000;
long sec = (diff % 60000) / 1000;
String minStr = new Long(min).toString();
String secStr = new Long(sec).toString();

if (min < 10)
 minStr = "0" + minStr;
if (sec < 10)
 secStr = "0" + secStr;

 _myLabel.setText(minStr + ":" + secStr);  
timerDisplay.deleteAll();
timerDisplay.add(_timerLabel);
 }
 }
}

В любом случае, когда вы останавливаете секундомер, он обновляет историческую таблицу данных времени круга. Когда этот список становится длинным, таймер начинает ухудшаться. Если вы попытаетесь прокрутить, то это будет очень плохо.

Есть ли лучший способ реализовать мой секундомер?

1 Ответ

3 голосов
/ 09 марта 2010

Вот несколько советов:

  • отслеживайте последнее значение «sec», использованное для обновления метки, и немедленно выходите из цикла выполнения, если только что рассчитанное значение «sec» совпадает - в противном случае вам не нужно обновлять интерфейс с теми же значениями что замедляет все
  • удалите синхронизацию в цикле выполнения и просто поместите код, который изменяет пользовательский интерфейс (вызов setText), в вызов UiApplication.getUiApplication.invokeLater () (с использованием анонимного Runnable)
  • не удаляйте повторное добавление метки с экрана или мастера, вам просто нужно вызвать setText (), и он должен обновиться - если он не обновляется, то вызовите invalidate () в поле, и он будет перерисованы
  • теперь, когда вы оптимизировали свой код и минимизировали количество фактического рисования пользовательского интерфейса, можно безопасно установить интервал таймерной задачи на более низкое значение, например, 50 мс, чтобы обеспечить более плавное обновление таймера

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

...