Originariamente inviato da
bovello
Ciao a tutti,
sto sviluppando un servizio che ogni tot minuti deve fare stuff (roba)
All'inizio avevo usato un time Timer che lanciava un Timertask, inizializzando il Time sia come daemon thread che no (non ho notato grossi cambiamenti tra i due).
Testando l'applicazione mi sono reso conto che l'esecuzione del job avveniva correttamente ma con scadenze temporali un po' approssimative. Con lo schermo spento tragedia... un job che doveva girare ogni 15 minuti stava ore senza dare segni di vita per poi eseguire tutte le schedulazioni una dietro l'altra.
Leggendo un po' in giro e sul sito ufficiale
Updating the UI from a Timer | Android Developers (anche se io non devo aggiornare la user interface) gli Handler sembravano una soluzione migliore, quindi ho utilizzato un oggetto handler a cui ho associato la sua bella classe Runnable.
Contestualmente, a scanso di equivoci, ho inserito una procedura di logging su file in modo da monitorare in fase di test la correttezza delle esecuzioni.
Fin quando il telefono rimane acceso o se in stand-by ma connesso via cavo usb al pc, è un orologio svizzero e non perde una schedulazione.
Nel momento in cui stacco il telefono dal cavo usb e va in stand-by le schedulazioni si interrompono... riprendendo riattacando il dispositivo al pc o tenendo il display acceso.
Quando funziona mi è sembrato migliore del Timer, perchè più puntuale, però in standby forse si comporta anche peggio perchè sembra che le schedulazioni perse non vengano mai recuperate.
Il mio servizio può essere controllato da una activity, ma principalmente gira per i fatti suoi e dovrebbe eseguire il suo codice a scadenze prefissate praticamente sempre (ok... a telefono spento no :P)
Il problema mi sembra di capire che risieda nel fatto che il telefono ad un certo punto va in standby e disabiliti l'esecuzione dei thread (o ne abbassi di molto la priorità)
Come fare??? Sbaglio qualcosa nell'implementazione degli Handler?
Leggevo anche di utilizzare Alarm Manager/Service che dovrebbero lavorare ad un livello più basso gestendo gli interrupt del processore. Però leggevo su Android Developers che erano sconsigliati in luogo degli Handler per la gestione dei timer ricorrenti.
Qualcuno ha qualche idea?
grazie mille,
ciao
Marco