Служба Android останавливается - PullRequest
8 голосов
/ 07 февраля 2011

Я дошел до того, что в нескольких шагах от того, чтобы стать лысым ...

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

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

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

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

Я создал 2 обработчика, один из которых запускал код для проверки серверов и увеличивал int по одному. Другой просто записал бы значение указанного 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

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

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

1 Ответ

14 голосов
/ 07 февраля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...