2016-11-18 20 views
1

Я пытаюсь создать пользовательский секундомер, который подсчитывается в android. Он должен быть довольно точным до 0,1 с и с пользовательской компоновкой и изображениями для примера цифр: DIGITS.Android Timer/Секундомер с пользовательским интерфейсом и удовлетворительной производительностью

Он также должен иметь возможность запускаться в фоновом режиме после того, как приложение было сведено к минимуму или закрыто. Чтобы быть более конкретным, заставить приложение оставаться открытым во время включения таймера (я не знаю, как это сделать).

До сих пор я пытался использовать Handlers, Runnables, scheduleExecutorService и класс Chronometer для Android.

У обработчиков были проблемы с производительностью, пережевывание на 45%> использование процессора (я думаю, это связано с постоянным обновлением пользовательского интерфейса?). Мне удалось заставить его работать с использованием запланированногоExecutorService со скромной производительностью, но он все еще имеет проблемы с продолжением в фоновом режиме или во время изменений ориентации.

Я пытаюсь создать нечто похожее на секундомер по умолчанию на HTC one M7. Он работает в фоновом режиме и во время изменений ориентации, не теряя времени.

Таймер будет в своем собственном фрагменте в действии с использованием макета ViewPager и скользящей вкладки.

Это работоспособным для секундомера

public Runnable run() { 

    return new Runnable() { 
     @Override 
     public void run() { 

      centiseconds++; 
      if (centiseconds > 9) { 
       centiseconds = 0; 
       seconds++; 
      } 
      if (seconds > 59) { 
       seconds = 0; 
       minutes++; 
      } 
      if (minutes > 59) { 
       minutes = 0; 
       hours++; 
      } 

      getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 

        updateCustomUI(); 

       } 
      }); 
     } 
    }; 
} 

В фрагменте я затем инициализировать scheduledExecutorService

ScheduledFuture scheduledFuture; 
ScheduledExecutorService scheduledExecutorService; 

Для запуска таймера

scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(run(), 0, 100, TimeUnit.MILLISECONDS); 

и остановить его

scheduledFuture.cancel(true); 
+0

Если вы выключили дисплей, или ваше приложение работает в фоновом режиме, ваш код не будет работать, потому что Android остановит его и ваш счетный код также остановится. Используйте CountDownTimer вместо собственного кода второго счета. – Robert

+0

Это было бы полезно только для подсчета голосов? Как бы реализовать его для подсчета UP? (как в секундомере). –

+0

Прочитайте документацию, после чего вы увидите, что существует метод 'onTick()', который может быть запущен за 1000 миллисекунд. – Robert

ответ

0

В этом случае вы можете использовать IntentService с ResultReciver

+0

Да, как я уже сказал в своем вопросе, я уже пробовал использовать обработчики. Я обнаружил, что их тайминги недостаточно согласованы для таймера, который я хотел создать. Это также не решило бы проблему того, чтобы работать в фоновом режиме, когда приложение приостановлено или остановлено. Или я что-то пропустил? –

+0

Я отредактировал свой ответ – GreenRobo

+0

Я еще не успел пережить намерения и трансляцию/ресиверы результатов. Я узнаю его и уйду. Я увижу, куда меня достает. –

0

Я попытался с помощью классов Android AnimationDrawable но производительность была примерно такие же, как и у androidDevelopers, не было много документации на нем, как точность и потенциал для переопределения и т. д.

Итак, я решил, что моя реализация была самой эффективной, максимизировалась примерно на 10% и в среднем на 7% на моем HTC One M7.

Хотя я не уверен, правильно ли я реализовал класс анимации, когда я его пробовал, если кто-то точно знает, как это работает, тогда не стесняйтесь, дайте мне знать.

Запуск запланированной службы -службы с использованием различной инициализации, по-видимому, решил работу фона.

Раньше я инициировал его с помощью

scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();

Теперь я использую

scheduledExecutorService= Executors.newScheduledThreadPool(16); 

Любое другое произвольное число для ThreadPool, кажется, работает нормально, я еще нужно оптимизировать его и найти нужное число ber потоков для использования, но это помогает функции scheduleExecutorService работать в фоновом режиме, имея больше потоков, которые он может извлечь, если некоторые из них будут уничтожены при уничтожении активности или фрагмента.