Как отобразить таймер в activity?
-
16-09-2019 - |
Вопрос
Мне нужно отобразить продолжительность нескольких моих действий в приложении.Таймер запускается при запуске одного из видов деятельности.
- Должен ли я использовать сервис для таймера?
- Является ли это лучшим способом ?
- Или я должен начать поток с одного из действий?
Решение
Я думаю, что в случае использования, который вы описываете, было бы лучше всего Магазин временные метки (см. Хранение данных) и вычислить дельты для использования графического интерфейса.Если вам нужно отобразить часы реального времени в одном из ваших действий, вы можете создать отдельный поток в этом действии просто для обновления часов.
Другие советы
Что ж, в зависимости от того, сколько работы с интерфейсом вам нужно для отображения вашего прогресса, я бы запустил поток в рамках действия, а затем создал таймер, который проверяет статус выполнения потока и обновляет интерфейс по мере необходимости.Сервисы хороши для фоновых задач, которые не требуют большого количества уведомлений / обновлений интерфейса.
Вот пример из проекта, над которым я сейчас работаю (UpdateListRunnable просто вызывает "notifyDataSetChanged()" в моем адаптере списка.Я делаю это несколько раз в коде, поэтому инкапсулировал его в класс.Кроме того, updateHandler - это просто обычный экземпляр обработчика):
@Override
public void run() {
Timer updateProgressTimer = null;
UpdateItem currentItem = null;
for(int i = 0; i < items.size(); i++) {
currentItemIndex = i;
currentItem = items.get(i);
if (currentItem.isSelected() == true) {
updateProgressTimer = new Timer();
updateProgressTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
updateHandler.post(new UpdateListRunnable());
}
}, 0, 2000); // check every 2 seconds
lookupDb.downloadUpdate(currentItem);
currentItem.setUpToDate(true);
currentItem.setStatusCode(UpdateItem.UP_TO_DATE);
currentItem.setProgress(0);
updateProgressTimer.cancel();
updateHandler.post(new UpdateListRunnable());
} // end if its the database we are hosting on our internal server
} // end for loop through update items
currentItemIndex = -1;
} // end updateThread run