Service in Loop: Handler e Thread

Imparare a programmareIn 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

  1. 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.
  2. 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.
  3. 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:

Concept Service Handler Thread

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.

Codice MyService Thread Handler

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:

Service in Loop: Handler e Thread ultima modifica: 2014-02-20T18:00:09+00:00 da Benedetto Nespoli