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 работать в фоновом режиме, имея больше потоков, из которых он может извлечь, если некоторые быть уничтоженным, когда деятельность или фрагмент будут уничтожены.

Другие вопросы по тегам