Exécuter du code sur le thread principal dans Android sans accès à une Activité?
J'ai un Android service qui démarre et maintient un thread d'arrière-plan.
De temps à autre, le thread d'arrière-plan doit faire un rappel sur le thread principal. Je suis perplexe quant à la façon de le faire.
Je ne peux pas appeler cela.runOnUiThread parce que "cela" est une instance de Service, pas d'Activité, et pour un Service qui n'ont pas de runOnUiThread méthode.
Je ne peux pas créer ou exécuter une AsyncTask, parce que la documentation pour les AsyncTask dit que le constructeur et la méthode execute doit être invoqué à partir du thread d'INTERFACE utilisateur.
Dois-je conserver une référence à l'activité qui est de l'utilisation du service et appeler sa runOnUiThread méthode, ou est-il un autre moyen de faire quelque chose sur le thread d'INTERFACE utilisateur?
Grâce.
- "le thread d'arrière-plan doit faire un rappel sur le thread principal" -- pourquoi?
- L'utilisateur du service est une activité. Il a besoin de rappels sur le thread principal de sorte qu'il peut mettre à jour des éléments de l'INTERFACE utilisateur. Je suppose que je pourrais revenir sur le thread d'arrière-plan et de le rendre responsable de la planification d'un thread d'INTERFACE utilisateur de rappel, mais il serait plus pratique pour le consommateur du service, si je pouvais le faire.
- Oh, ciel pas.
Vous devez vous connecter pour publier un commentaire.
Je suis en utilisant le code suivant de temps en temps si je n'ai pas un accès direct à l'Activité (pour une raison ou une autre);
Utilisation
LocalBroadcastManager
et le service envoyer une diffusion, d'être repris par l'activité, qui va l'obtenir sur le thread principal de l'application. Voici un exemple d'application de cette démonstration.Ou, l'utilisation d'une "vraie" émission avec
sendBroadcast()
.Ou utiliser un
Messenger
, comme you786 mentionné, attaché à uneHandler
, comme Guillermo mentionné, si vous n'avez pas nécessairement besoin d'utiliser de liaison pour elle.Votre activité
apeut lier le service.http://developer.android.com/guide/components/bound-services.html
Plus précisément, jetez un oeil à la création d'un Messager sur cette page. L'activité de client peut donner un messager de l'objet qui répond à des messages de service, et une fois reçu, exécuter n'importe quel code de l'INTERFACE utilisateur est nécessaire sur le thread d'INTERFACE utilisateur à l'aide d'un gestionnaire.
NE PAS maintenir l'activité de référence dans le service. Cela peut conduire à toutes sortes de problèmes de mémoire.
Messenger
est une belle solution, vous n'avez pas à se lier au service de l'utiliser.Messenger
estParcelable
et peut être envoyé dans unIntent
supplémentaire dans une commande envoyée parstartService()
.Sûr. Voir Gestionnaire. Vous pouvez donner à votre service un gestionnaire d'objet et lorsque les besoins du service pour exécuter une tâche Exécutable sur le thread de l'INTERFACE utilisateur doivent juste gestionnaire d'appel.la poste(some_runnable_task). Cet appel. Pouvez trouver un exemple dans ce lien 4.Tutoriel: Gestionnaire De.