2011-02-07 2 views
8

Я пришел к точке, где я несколько шагов от лысеть ...Android остановки службы

Я пытаюсь запустить службу, которая будет проверять, если серверы в моей работе работают , Он должен делать это каждые 5 минут.

Я прошел через TimerTask, ScheduledExecutorService и, наконец, обработчик. Все они работают «отлично» в течение нескольких часов, за исключением некоторой неточности, 1-5 минут, а затем внезапно «таймер» просто прекращает стрельбу.

Теперь я прочитал, что планировщик остановится, если встретит неискушенное исключение, и я уверен, что это так же и с TimerTask. Но проверяя файлы журнала, никаких исключений вообще нет ...

Когда я вернулся с работы сегодня, я решил провести эксперимент с Handler.

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

Он работает великолепно, с обычными 1-5 минут неточностями, в течение нескольких часов, а затем останавливается, ниже последние строки из журнала:

02-07 20:03:25.892 D/dalvikvm( 992): GC_EXPLICIT freed 192K, 53% free 4295K/9031K, external 3755K/4825K, paused 114ms 
02-07 20:03:35.572 D/dalvikvm(5472): GC_EXPLICIT freed <1K, 54% free 2895K/6279K, external 2002K/2137K, paused 61ms 
02-07 20:04:42.212 V/ServerChecker(12568): Timer triggered 
02-07 20:04:42.212 V/ServerChecker(12568): Checking: linux15 
02-07 20:04:44.152 V/ServerChecker(12568): Checked: linux15 
02-07 20:04:44.152 V/ServerChecker(12568): Checking: linux1 
02-07 20:04:44.462 V/ServerChecker(12568): Checked: linux1 
02-07 20:04:44.462 V/ServerChecker(12568): Checking: linux12 
02-07 20:04:44.762 V/ServerChecker(12568): Checked: linux12 
02-07 20:04:44.762 V/ServerChecker(12568): Checking: linux9 
02-07 20:04:45.072 V/ServerChecker(12568): Checked: linux9 
02-07 20:04:45.072 V/ServerChecker(12568): Checking: linux14 
02-07 20:04:45.382 V/ServerChecker(12568): Checked: linux14 
02-07 20:04:45.382 V/ServerChecker(12568): Test timer triggered: 13 
02-07 20:05:01.002 E/InputDispatcher( 223): channel '406cefc8 com.n04dev.serverchecker/com.n04dev.serverchecker.ServerChecker (server)' ~ Consumer closed input channel or an error occurred. events=0x8 
02-07 20:05:01.002 E/InputDispatcher( 223): channel '406cefc8 com.n04dev.serverchecker/com.n04dev.serverchecker.ServerChecker (server)' ~ Channel is unrecoverably broken and will be disposed! 
02-07 20:05:08.932 D/dalvikvm(12842): GC_EXPLICIT freed 73K, 51% free 2641K/5379K, external 2002K/2137K, paused 37ms 
02-07 20:05:09.132 D/dalvikvm( 185): GC_EXPLICIT freed 11K, 53% free 2554K/5379K, external 2002K/2137K, paused 96ms 
02-07 20:05:12.022 D/dalvikvm( 185): GC_EXPLICIT freed <1K, 53% free 2554K/5379K, external 2002K/2137K, paused 164ms 
02-07 20:05:12.062 D/dalvikvm( 185): GC_EXPLICIT freed <1K, 53% free 2554K/5379K, external 2002K/2137K, paused 36ms 
02-07 20:05:18.612 D/dalvikvm(12852): GC_EXPLICIT freed 59K, 52% free 2596K/5379K, external 2002K/2137K, paused 72ms 

Я посмотрел на последние два сообщения относительно моего приложения и найдено this thread - Но я не вижу, как это применится в моем случае.

Надеюсь, вы, ребята, знаете, что я делаю неправильно. Я занимаюсь этим в течение нескольких недель. Попытка разных таймеров, когда таймер пытается поймать «главный» таймер, останавливаясь, а затем перезагружая его, но не повезло, и, как показывает мой последний эксперимент, похоже, проблема с таймером .. я думаю ..

ответ

14

Я прошел через TimerTask, ScheduledExecutorService и, наконец, обработчик. Все они работают «отлично» в течение нескольких часов, за исключением некоторой неточности, 1-5 минут, а затем внезапно «таймер» просто прекращает стрельбу.

Конечно. Ни одно из них не предназначено для вашей цели, так как они не поддерживают работу устройства и не играют хорошо с каркасом Android. Наличие службы в ОЗУ 24x7 просто для того, чтобы отметить течение времени, расточительно, и Android становится более агрессивным с каждым пропущенным выпуском при выключении вечных сервисов, подобных этому.

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

Если вы намерены иметь это произойдет, даже если устройство засыпает, используйте _WAKEUP сигнализацию с AlarmManager и моей WakefulIntentService (или что-то вдоль этих линий).

+3

Да, термин «сервис» в ОС Android не похож на службу Windows, которая просто работает в фоновом режиме навсегда - служба андроида - это просто приложение, которое не имеет интерфейса, и поэтому оно подлежит стандарту управление памятью/очистка. Тревога, призывающая к намерению, определенно подходит. –

+0

Огромное спасибо, что сделал трюк - теперь он работает без остановки в течение 9 часов, стреляя в точную отметку в 5 минут :) - И спасибо Гаю за это объяснение – noir04

+0

У меня такая же проблема - однако это никогда пришло мне в голову, что это может быть связано с нашей службой ... У нас есть служба, которая запускается, а затем Thread.sleeps, просыпается через некоторое время и т. д. ... Интересно, может ли это быть связано, потому что я получаю то же самое ошибка. – AgentKnopf

Смежные вопросы