2014-08-31 6 views
2

J'ai construit un lecteur de musique qui fonctionne sur un service. Je suis préformant diverses actions comme le jeu, la pause, la chanson suivante, la chanson précédente etc à travers une liaison au service de mon activité.Confusion à propos de MusicService

Cela fonctionne totalement bien.

Donc à ma question: Est-ce idéal pour mettre le service sur un nouveau fil? Je sais que le service est exécuté par défaut sur le thread principal/interface utilisateur. Sinon, comment savoir quand mettre quelque chose sur un nouveau sujet? Puis-je mettre toute l'instance de Service sur un nouveau thread ou juste une partie du code dans le Service?

Je suppose que cela s'appelle un service de longue durée, ne devrait pas être sur un thread propre pour ne pas bloquer l'interface utilisateur? Lors du débogage, je peux le voir dans Logcat: I/Choreographer (691): Saute de 60 images! L'application peut-être faire trop de travail sur son fil principal ... Cela m'a fait me demander aussi! :

Comme mon titre l'indique, je suis très confus à ce sujet!

Répondre

1

Vous avez raison, les services ne sont pas des threads (ils ne créent pas un fil différent). Lors du démarrage d'une activité, ils bloquaient le thread principal/UI exécutant des opérations longues. vous pouvez utiliser IntentService - qui démarre son propre thread pour effectuer des opérations de longue durée en arrière-plan - mais cela conviendrait probablement mieux à une tâche de fichier de téléchargement ou à un calcul à long terme qu'à la lecture de musique. notez que IntentService crée et détruit le fil par lui-même (lorsque le travail est terminé).

Une autre option serait de créer votre propre thread manuellement.

Cela dit, je considère cet article: http://developer.android.com/guide/topics/media/mediaplayer.html Il parle d'un service au premier plan en utilisant startForeground() qui ajoute une notification à la barre d'état, de laisser l'utilisateur soit conscient du fait que le service fonctionne - ainsi que la promotion du service afin qu'il ne soit pas détruit en cas de mémoire insuffisante (ce pourrait être - mais il sera probablement le dernier à être fermé). l'exemple est sur l'exécution lecteur multimédia tout en prenant le thread principal blocage en considération, ainsi que la gestion des événements du système pour mettre en pause et jouer de la musique comme prévu (en utilisant BroadcastReceiver)

Notez également ceci: http://developer.android.com/guide/components/services.html

Si vous utilisez un service ou un thread?

Un service est simplement un composant qui peut s'exécuter en arrière-plan même lorsque l'utilisateur n'interagit pas avec votre application. Ainsi, vous devez créer un service uniquement si c'est ce dont vous avez besoin.

Si vous avez besoin d'effectuer un travail en dehors de votre thread principal, mais seulement pendant que l'utilisateur interagit avec votre application, alors vous devriez probablement créer un nouveau thread et non un service à .Par exemple, si vous voulez jouer de la musique, mais seulement lorsque votre activité est en cours d'exécution, vous pouvez créer un thread dans onCreate(), lancez-le en onStart(), puis arrêtez-le dans onStop(). Envisagez également d'utiliser AsyncTask ou HandlerThread, au lieu de la classe Thread traditionnelle. Pour plus d'informations sur les threads, consultez le document Processus et threads .

Rappelez-vous que si vous utilisez un service, il fonctionne toujours en thread principal par défaut de votre application , vous devriez donc toujours créer un nouveau thread au sein du service si elle effectue opérations intensives ou de blocage.

Questions connexes