2012-06-24 7 views
6

Ho una classe IntentService che può essere avviata da vari punti in un'applicazione complessa: attività, thread in background e altri servizi. Mi piacerebbe tenere un contatore di quante volte il servizio è stato invocato. Io uso una variabile int privata all'interno della mia classe IntentService per tenerne traccia, la incremento dal mio metodo onStartCommand(...).Il thread del metodo onStartCommand (..) di IntentService è sicuro?

Mi è appena venuto in mente, poiché il metodo onStartCommand (...) può essere chiamato da vari thread asincroni, che questa potrebbe non essere una soluzione thread-safe. Quindi la domanda è, ho bisogno di racchiudere l'accesso a questa variabile contatore in un blocco sincronizzato, o l'implementazione IntentService di onStartCommand (...) si occupa di questo per me?

Come nota, so che è possibile incrementare in modo sicuro la variabile da onHandleIntent(...), ma avrei bisogno di un conteggio sulle richieste effettive e non sugli intenti eseguiti.

risposta

14

Mi è appena venuto in mente, poiché il metodo onStartCommand (...) può essere chiamato da vari thread asincroni, che questa potrebbe non essere una soluzione thread-safe.

onStartCommand() viene sempre chiamato nella thread dell'applicazione principale in qualsiasi servizio. Non puoi essere chiamato con onStartCommand() in due thread contemporaneamente.

+0

Imparare cose nuove ogni giorno. Grazie! –

+0

Quindi non è sicuro? – digitizedx

+0

@digitizedx: è ** what ** not thread safe? 'onStartCommand()' è, nella misura in cui è sempre e solo chiamato sul thread dell'applicazione principale. – CommonsWare