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

#android #timer #handler #delay

#Android #таймер #обработчик #задержка

Вопрос:

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

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

    private Runnable timerRunnable = new Runnable() {

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

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

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

Ответ №1:

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

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

Ответ №2:

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

Комментарии:

1. с неопределенным я имею в виду до 20 минут позже: (

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