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 ..
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. –
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
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