Service in Loop: Handler e Thread
In un articolo precedente avevamo visto come creare un Service, ma i Service normalmente servono per eseguire azioni ripetute in background, in “loop” infinito, finché non si stoppa per liberare memoria o perché lo vuole l’utente, o l’applicazione stessa.[banner size=”300X250″]
Cosa serve sapere
- Basi solide di programmazione sia java che per android (Activity, Thread ..)
- Conoscere i Service (cfr. articolo sopracitato).
Ipotesi di Risoluzione
- Una prima idea è quella di creare nel service un while(true), intervallato da Thread.sleep(ms), ma questo porta l’applicazione a crashare, in quanto il service gira nello stesso thread dell’applicazione stessa, e creando questo while(true) l’applicazione non risponderebbe più. Ipotesi quindi da scartare.
- Si potrebbe pensare a questo punto di creare un thread all’interno del Service, e avviare un while(true) nel thread, sempre intervallato da uno sleep. Il problema qui sta nel fatto che non sarà possibile modificare la UI, oppure anche mandare Toast, o altri elementi grafici.
- Soluzione finale: creare un handler, un’oggetto che può interagire con gli elementi grafici, e richiamarlo all’interno del thread, avviato dentro al Service. Sembra un casino, ma è piuttosto semplice in realtà più che a parole con il codice.
Ecco quindi un concept:
Codice
Passiamo alla parte del codice. Abbiamo due classi, la normale Activity e una classe creata da noi, il service.
Activity
Nell’Activity abbiamo solo una linea in più a quelle pre-generate:
startService(new Intent(this, MyService.class));
Quello che fa, già visto nell’articolo precedente, è far partire il service nella classe MyService.
MyService
In questa classe, creata da noi, estendiamo Service, e sovrascriviamo il metodo onStartCommand.
Questo metodo viene chiamato ogni volta che un’activity chiede di far partire il Service, a differenza di onCreate, che si esegue solo una volta.
Vi lascio il codice anche su pastebin, da copi-incollare 🙂
Quindi all’interno di questo metodo creiamo un Handler e un Thread. Nell’Handler sovrascriviamo il normale handleMessage, al cui interno creiamo un Toast a scopo d’esempio.
Nel Thread facciamo andare un ciclo infinito, con la chiamata all’handler a intervalli di 5000ms. A seguito facciamo partire il thread
Fine! Semplice, ma molto utile per me, come spero lo sia stato per voi.
Alla prossima!
[banner size=”468X60″]
Seguiteci anche su Facebook, Google Plus, Tumblr e Twitter, per restare sempre in contatto con noi e con le nostre guide.
Potrebbero esservi utili questi libri: