2016-09-05 5 views
-2

Что было бы самым точным решением для нескольких последовательных таймеров в Java/android? Или, другими словами, что является лучшим вариантом для задержки следующего фрагмента кода до окончания текущего таймера?В Java (android), что является хорошим способом создания точных последовательных таймеров?

Исходная информация, если вопрос неясен: Чтобы практиковать кодирование, я хотел бы создать бесплатное приложение без рекламы, чтобы помочь в практической реализации фридайвинга. Основная идея - иметь несколько таймеров, которые работают друг за другом. Пример:

  1. 2 минут дыхание до
  2. задержать дыхание в течение 2 минут
  3. 2 минуты дыхание до
  4. задержать дыхание в течение 2 минут + 15 секунд
  5. 2 минуты дыхание до
  6. задержите дыхание в течение 2 минут + 15 секунд + 15 секунд и так далее; обычно 8 раундов задерживания дыхания, что приводит к 16 последовательным таймерам

Сначала я думал, что могу использовать класс таймера, но я не знаю, как приостановить код до окончания таймера. Так что все таймеры бегали одновременно. Я читал о CountDownLatch и Handler, но у меня недостаточно опыта, чтобы судить, что было бы лучше для моей цели. Раньше я делал версию python и использовал сон. Он работал нормально, но для более длинных таймеров это было неточно на несколько секунд, что является проблемой.

Другой вариант, я считаю, состоит в том, чтобы использовать обычный таймер, но запускать цикл while до отображаемого текста == 0. Я не знаю, мог ли этот бесконечный цикл сбой приложения, помешать точности таймера или любые другие отрицательные побочные эффекты.

Любая помощь/мысли будут оценены. Благодаря!

+0

Перед отправкой, выполните поиск переполнения стека. Эта тема была рассмотрена много раз. Поиск таймеров, исполнителей, ScheduledExecutorService и Java в реальном времени. –

ответ

0

Я предлагаю вам проверить системное время каждые несколько миллисекунд.
Вы можете добиться такого же эффекта через System.currentTimeMillis() и Handler.

  1. сохранить системное время в начале таймера.
  2. Установите обработчик для запуска каждые 100 мс (0,1 секунды) и проверьте текущее системное время.
  3. Если (текущее время - время начала)> 2000, выполните следующий шаг.

Что-то вроде ниже ...

class TimerHandler extends Handler 
{ 
    private long start; 
    private long timeGap; 

    public void set(long gap) 
    { 
     start = System.currentTimeMillis(); 
     this.timeGap = gap; 
    } 

    @Override 
    public void handleMessage(Message msg) 
    { 
     long curr = System.currentTimeMillis(); 
     if(curr - start > timeGap) 
     { 
      // do what you want. 
      // If you want your timer to keep on running, 
      // reset start. 
     } 

     // send Next Message after 100 ms. 
     sendEmptyMessageDelayed(-1, 100); 
    } 
} 

В вашей деятельности или что-то:

public void startTimer(long gap) 
{ 
    TimerHandler handler = new TimerHandler(); 
    handler.set(gap); 
    handler.sendEmptyMessageDelayed(-1, 100); 
} 

startTimer(2000); 


Обратите внимание, что вы можете уменьшить ошибку, используя небольшой nextTimer при вызове sendEmptyMessageDelayed(), но это заставит вашу ОС чаще проверять ваш поток, что не очень хорошо.

+0

Спасибо Сухён. Эта идея, похоже, именно то, что я ищу. У меня все еще есть несколько проблем при определении того, как правильно начать следующее действие, но я думаю, что у меня есть направление сейчас :) (Я считаю, что мне нужно начать следующее действие непосредственно из метода handleMessage правильно? Если я его добавлю в методе startTimer он начнется немедленно и проигнорирует задержку) –

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

  • Нет связанных вопросов^_^