J'essaie quelque chose de nouveau sur Android pour lequel j'ai besoin d'accéder au gestionnaire du thread d'interface utilisateur.
Je sais ce qui suit:
- Le thread d'interface utilisateur a son propre gestionnaire et son propre boucleur
- Tout message sera placé dans la file d'attente des messages du fil d'interface utilisateur
- Le boucleur récupère l'événement et le transmet au gestionnaire
- Le gestionnaire gère le message et envoie l'événement spécifique à l'interface utilisateur
Je veux avoir mon service qui doit obtenir le gestionnaire de threads de l'interface utilisateur et mettre un message dans ce gestionnaire. Pour que ce message soit traité et envoyé à l'interface utilisateur. Ici, le service sera un service normal qui sera démarré par une application.
Je voudrais savoir si cela est possible. Si tel est le cas, veuillez suggérer des extraits de code afin que je puisse l'essayer.
Cordialement Girish
la source
Créez un
Messenger
objet attaché à votreHandler
et passez-leMessenger
auService
(par exemple, dans unIntent
extra pourstartService()
). LeService
peut alors envoyer unMessage
auHandler
via leMessenger
. Voici un exemple d'application démontrant cela.la source
Handler
, vous ne pouvez pas y accéder, AFAIK.ViewRoot
dans le SDK Android, AFAICT.Handler
/Messenger
, bien que je remplace tout cela par un bus d'événements (par exemple, l'EventBus de greenrobot).Pour le moment, je préfère utiliser la bibliothèque de bus d'événements comme Otto pour ce genre de problème. Abonnez-vous simplement aux composants souhaités (activité):
Ensuite, fournissez une méthode de rappel:
puis lorsque votre service exécute une instruction comme celle-ci:
Ce POJO sera transmis à votre activité ci-dessus et à tous les autres composants d'abonnement. Simple et élégant.
la source
Je suggère d'essayer le code suivant:
la source
Vous pouvez obtenir des valeurs via le récepteur de diffusion ... comme suit, créez d'abord votre propre IntentFilter en tant que,
Puis créez la classe interne BroadcastReceiver comme,
Enregistrez maintenant votre récepteur de diffusion dans onResume () en tant que,
Et enfin désenregistrer BroadcastReceiver dans onDestroy () comme,
Maintenant, la partie la plus importante ... Vous devez déclencher la diffusion à partir de l'endroit où vous devez envoyer des valeurs ..... alors faites comme,
....à votre santé :)
la source
En
kotlin
thats comment vous pouvez le faireDisons si vous souhaitez afficher le message Toast du service
la source
Solution:
Handler
avec àLooper
partir du thread principal: responseHandler et overridehandleMessage
méthode deRunnable
tâche, appelez sendMessage sur responseHandlersendMessage
appel de résultat de handleMessage dans responseHandler.Message
et traitez-les, mettez à jour l'interface utilisateurExemple de code:
la source