Android Timer/ Секундомер с пользовательским интерфейсом и удовлетворительной производительностью
Я пытался создать собственный секундомер, который рассчитывает на Android. Он должен быть достаточно точным с точностью до 0,1 с и с пользовательским макетом и изображениями для примера с цифрами: DIGITS.
Он также должен быть в состоянии работать в фоновом режиме после того, как приложение было свернуто или закрыто. Чтобы быть более конкретным, заставить приложение оставаться открытым, пока таймер включен (я не знаю, как этого добиться).
До сих пор я пытался использовать Handlers, Runnables, scheduleExecutorService и класс Android Chronometer.
У обработчиков были проблемы с производительностью, из-за чего потреблялось 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();
}
});
}
};
}
Во фрагменте я затем инициализирую scheduleExecutorService
ScheduledFuture scheduledFuture;
ScheduledExecutorService scheduledExecutorService;
Запустить таймер
scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(run(), 0, 100, TimeUnit.MILLISECONDS);
и остановить это
scheduledFuture.cancel(true);
2 ответа
В этом случае вы можете использовать IntentService с ResultReciver
Я пробовал использовать классы Android AnimationDrawable, но производительность была примерно такой же, и у androidDevelopers не было много документации по ней, такой как точность и возможность переопределения и т. Д.
Поэтому я решил, что моя реализация была наиболее эффективной: максимум около 10% и в среднем 7% на моем HTC one M7.
Хотя я не уверен, правильно ли я реализовал класс Animation, когда попробовал его, если кто-то точно знает, как он работает, не стесняйтесь, дайте мне знать.
Запуск scheduleExecutorService с использованием другой инициализации, казалось, решил фоновую работу.
Ранее я инициировал это с помощью
scheduledExecutorService= Executors.newSingleThreadScheduledExecutor();
теперь я использую
scheduledExecutorService= Executors.newScheduledThreadPool(16);
Любое другое произвольное число для пула потоков, кажется, работает просто отлично, я еще не оптимизировал его и не нашел нужное количество потоков для использования, но это помогает scheduleExecutorService работать в фоновом режиме, имея больше потоков, из которых он может извлечь, если некоторые быть уничтоженным, когда деятельность или фрагмент будут уничтожены.