2011-02-07 19 views
8

Sono venuto al punto in cui io sono a pochi passi da andare calvo ...servizio di Android si ferma

Sto cercando di eseguire un servizio che controllerà se i server al mio lavoro sono in esecuzione . Dovrebbe farlo ogni 5 minuti.

Sono passato attraverso TimerTask, ScheduledExecutorService e infine Handler. Funzionano tutti "bene" per alcune ore, tranne che per qualche imprecisione, 1-5 minuti fuori, e poi improvvisamente il "timer" smette di sparare.

Ora, ho letto che lo Scheduler si fermerà se incontra un'eccezione non rilevata, e sono sicuro che sia così anche con il TimerTask - Ma controllando i file di log, non ci sono eccezioni affatto ...

Quando sono tornato a casa dal lavoro oggi ho deciso di fare un esperimento con Handler.

Ho creato 2 gestori, uno eseguiva il codice per controllare i server e incrementare un int uno alla volta. L'altro dovrebbe solo registrare il valore di detto int, in modo da non fermarsi nel caso incontrasse un'eccezione (non riesco a vedere come sarebbe).

Funziona alla grande, con il solito 1-5 minuti imprecisione, per alcune ore e poi si ferma, qui di seguito sono le ultime righe 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 

Ho guardato gli ultimi due messaggi riguardante la mia app e trovato this thread - Ma non riesco a vedere come ciò si applicherebbe nel mio caso.

Spero davvero che voi ragazzi abbiate un'idea di quello che sto facendo male. Ci sono stato per settimane ... Cercando timer diversi, avendo un timer provavo a catturare il timer "principale" fermandolo e poi riavviandolo, ma senza fortuna, e come mostra il mio ultimo esperimento, non sembra essere un problema con il timer .. Penso che ..

risposta

14

Sono passato attraverso TimerTask, ScheduledExecutorService e infine Handler. Funzionano tutti "bene" per poche ore, tranne per qualche imprecisione, 1-5 minuti di pausa, e poi improvvisamente il "timer" smette di sparare.

Naturalmente. Nessuno di questi è stato progettato per il tuo scopo, in quanto né mantiene il dispositivo sveglio, né gioca bene con il framework Android. Avere un servizio in RAM 24x7 solo per segnare il passare del tempo è uno spreco, e Android diventa più aggressivo con ogni rilascio che passa alla chiusura di servizi eterni come questo.

Utilizzare AlarmManager per impostare la pianificazione e un IntentService per eseguire il lavoro effettivo. Lo IntentService fornisce automaticamente il thread in background per l'I/O di rete e arresta automaticamente il servizio al termine del lavoro.

Se avete intenzione di avere questo avviene anche se il dispositivo si addormenta, utilizzare un allarme di _WAKEUP con AlarmManager e la mia WakefulIntentService (o qualcosa del genere).

+3

Sì, il termine "servizio" nel sistema operativo Android non è come un servizio di Windows, che viene eseguito in background per sempre - un servizio Android è solo un'applicazione che non ha front-end, ed è quindi soggetta a standard gestione della memoria/pulizia. L'allarme che chiama un intento è sicuramente la strada da percorrere. –

+0

Grazie mille Marco, questo ha fatto il trucco - Ora è in esecuzione senza interruzioni per 9 ore, sparando esattamente ai 5 minuti segnati :) - E grazie Guy per questa spiegazione – noir04

+0

Sto affrontando lo stesso problema - tuttavia non è mai stato mi è venuto in mente che potrebbe essere correlato al nostro servizio ... Abbiamo un servizio che funziona, e poi Thread.sleeps, si sveglia dopo un po 'ecc ... Mi chiedo se questo potrebbe essere correlato, perché sto ottenendo lo stesso errore. – AgentKnopf

Problemi correlati