2011-02-07 13 views
8

he llegado al punto en el que estoy a pocos pasos de la calvicie ...servicio de Android se detiene

Estoy intentando ejecutar un servicio que va a comprobar si los servidores en mi trabajo están ejecutando . Se supone que debe hacer esto cada 5 minutos.

He pasado por TimerTask, ScheduledExecutorService y finalmente Handler. Todos funcionan "bien" durante unas horas, a excepción de algunas inexactitudes, 1-5 minutos de inactividad, y de repente el "temporizador" simplemente deja de disparar.

Ahora, he leído que el Programador se detendrá si encuentra una excepción no detectada, y estoy seguro de que así es también con el TimerTask - Pero verificando los archivos de registro, no hay excepciones en absoluto ...

Cuando llegué a casa del trabajo hoy, decidí hacer un experimento con Handler.

Creé 2 controladores, uno correría el código para verificar los servidores e incrementaría uno int a la vez. El otro simplemente registraría el valor de dicha int, para no detenerse, si encontrara una excepción (aunque no puedo ver cómo sería).

Se ejecuta muy bien, con el 1-5 minutos habitual inexactitud, por unas horas y luego se detiene, a continuación es las últimas líneas del registro:

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 

He mirado los dos últimos mensajes sobre mi aplicación y encontré this thread - Pero no veo cómo se aplicaría en mi caso.

Realmente espero que ustedes tengan alguna idea de lo que estoy haciendo mal. Lo he estado haciendo durante semanas. Probé diferentes temporizadores, tuve un temporizador tratando de atrapar el temporizador "principal" parando y luego reiniciándolo, pero sin suerte, y como muestra mi último experimento, no parece ser un problema con el temporizador ... creo ...

Respuesta

14

He pasado por TimerTask, ScheduledExecutorService y finalmente Handler. Todos funcionan "bien" durante unas horas, a excepción de alguna inexactitud, de 1 a 5 minutos, y de repente el "temporizador" simplemente deja de disparar.

Por supuesto. Ninguno de ellos está diseñado para su propósito, ya que ni mantienen el dispositivo en funcionamiento ni funcionan bien con el marco de Android. Tener un servicio en RAM 24x7 solo para marcar el paso del tiempo es un desperdicio, y Android se vuelve más agresivo con cada versión que pasa al cerrar servicios eternos como este.

Use AlarmManager para configurar su agenda y IntentService para hacer el trabajo real. El IntentService le proporciona automáticamente el hilo de fondo para su E/S de red, y apaga automáticamente el servicio cuando se completa el trabajo.

Si pretende que esto ocurra incluso si el dispositivo se queda dormido, use una alarma _WAKEUP con AlarmManager y mi WakefulIntentService (o algo similar).

+3

Sí, el término "servicio" en el sistema operativo Android no se parece en nada a un servicio de Windows, que se ejecuta en segundo plano para siempre: un servicio de Android es simplemente una aplicación que no tiene front-end, y por lo tanto está sujeto a estándares gestión/limpieza de memoria. La alarma que llama un intento es definitivamente el camino a seguir. –

+0

Muchas gracias Mark, el truco funcionó: ahora ha estado funcionando sin parar durante 9 horas, disparando en la marca exacta de 5 minutos :) - Y gracias Guy por esa explicación – noir04

+0

Estoy enfrentando el mismo problema, sin embargo, nunca se me ocurrió que podría estar relacionado con nuestro Servicio ... Tenemos un Servicio que se ejecuta, y luego Thread.sleeps, se despierta después de un tiempo, etc. ... Me pregunto si esto podría estar relacionado, porque estoy obteniendo el mismo error. – AgentKnopf

Cuestiones relacionadas