Обработчик postDelayed задерживается дольше, как настроено

Я пытаюсь разработать простой бипер с таймером, который пищает каждый час. Для времени я использую службу и обработчик, вот пример:

    void onStart(...){
        handler.postDelayed(timerRunnable, ONE_HOUR);
    }

    private Runnable timerRunnable = new Runnable() {

    @Override
        public void run() {
               ...beep
               handler.postDelayed(timerRunnable, ONE_HOUR);
        }
    };

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

Я пробовал тот же сценарий с TimerTask и с «ручной» реализацией потока, но с тем же недетерминированным результатом.


person Mark    schedule 28.04.2011    source источник


Ответы (2)


Вероятно, вам больше повезет, если вы воспользуетесь AlarmManager для такой большой задержки. Handler лучше всего подходит для тиков и тайм-аутов, когда ваше приложение находится на переднем плане.

http://developer.android.com/reference/android/app/AlarmManager.html

person LeffelMania    schedule 28.04.2011

Android не является операционной системой реального времени. Все postDelayed() гарантирует, что это будет как минимум указанное количество миллисекунд. Кроме того, это будет зависеть, в первую очередь, от того, что делает основной поток приложения (если вы связываете его, он не может обработать Runnable), и, во-вторых, от того, что еще происходит на устройстве (службы работают с фоновым приоритетом и, следовательно, получают меньше ресурсов ЦП). время, чем передний план).

person CommonsWare    schedule 28.04.2011
comment
под недетерминированным я имею в виду до 20 минут позже :( - person Mark; 29.04.2011
comment
@Mark: @LeffelMania говорит правду! Вы не хотите, чтобы служба зависала в памяти исключительно для того, чтобы отмечать время этой продолжительности. Пожалуйста, пожалуйста, используйте AlarmManager для чего-то подобного. Это решит вашу проблему как побочный эффект. - person CommonsWare; 29.04.2011