English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La présente instance décrit la méthode de résolution du problème où Toast ne peut pas s'afficher normalement dans Android Service. Partageons-le avec tous pour une référence, voici les détails :
Lors de l'exercice simple de Service, dans les méthodes OnCreate, OnStart et OnDestroy du Service, on appelle Toast.makeText de la même manière que dans les Activity, et on appelle les méthodes onStart et onDestroy de ce service à travers deux boutons dans l'Activity :
Le code de DemoService est le suivant :
@Override public void onCreate() { super.onCreate(); Toast.makeText(getApplicationContext(), "Service is created!", Toast.LENGTH_LONG).show(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Toast.makeText(getApplicationContext(), "Service is on!", Toast.LENGTH_LONG).show(); } @Override public void onDestroy(){ super.onDestroy(); Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show(); }
Après l'exécution, les informations dans DemoService ne s'affichent pas.
Au début, on pensait que le Context obtenu n'était pas correct, en appelant directement getApplicationContext() dans le Service, on obtient le Context du Service. Mais en analysant de plus près, Toast devrait obtenir le Context de l'UI principale pour s'afficher, donc j'ai cherché un peu, et dans les instructions de Google sur Toast, il y a une phrase :
“Un toast peut être créé et affiché à partir d'une Activity ou d'un Service. Si vous créez une notification de toast à partir d'un Service, elle apparaîtra devant l'Activity actuellement au premier plan.”
(http://developer.Android.com/guide/topics/ui/notifiers/toasts.html)
Selon cette phrase, le toast créé dans le service apparaîtra devant l'UI de l'Activity actuellement au premier plan. Mais pourquoi n'a-t-il pas fonctionné ? Revenons à la méthode makeText.
Il semble toujours s'agir d'un problème de Context, donc pour que le toast fonctionne correctement, il doit s'exécuter sur le thread principal de l'Activity. Alors, comment obtenir le Context de l'UI du thread principal ? Il est possible de faire exécuter un thread personnalisé sur le thread principal à l'aide d'un Handler.
Revenons à la méthode show de Toast :
public void show() { ... service.enqueueToast(pkg, tn, mDuration); //Insérer ce toast dans une file de messages ... }
En termes de principe, en Android, il s'agit principalement de files de messages et de boucles de messages, où le thread principal récupère des messages de la file de messages et les traite. Le Handler est considéré comme une classe utilitaire, utilisée pour insérer des messages dans la file de messages. Par conséquent, nous refactorons le code original :
@Override public void onCreate() { super.onCreate(); handler=new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "Service is created!", Toast.LENGTH_LONG).show(); } }); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); handler=new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "Service is on!", Toast.LENGTH_LONG).show(); } }); } @Override public void onDestroy(){ super.onDestroy(); handler=new Handler(Looper.getMainLooper()); handler.post(new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "Service is off!", Toast.LENGTH_LONG).show(); } }); }
L'effet après l'exécution est le suivant :
Résumé :Pour que Toast fonctionne correctement dans le Framework Android, il doit être ajouté à la file d'attente du thread principal.
Les lecteurs intéressés par plus de contenu sur Android peuvent consulter les sujets spéciaux de ce site : 'Entrée en matière et tutoriel avancé de développement Android', 'Résumé des techniques de vue View Android', 'Résumé des techniques d'opération activity en programmation Android', 'Résumé des techniques de manipulation de bases de données SQLite Android', 'Résumé des techniques de manipulation de données au format JSON Android', 'Résumé des techniques d'opération de bases de données Android', 'Résumé des techniques de manipulation de fichiers Android', 'Résumé des méthodes de manipulation de la carte SD Android', 'Résumé des techniques de manipulation des ressources Android' et 'Résumé des utilisations des contrôles Android'.
J'espère que les informations de cet article vous seront utiles pour la conception de programmes Android.
Déclaration : Le contenu de cet article est issu du réseau, propriété des auteurs respectifs, contribué et téléversé par les utilisateurs d'Internet. Ce site n'est pas propriétaire des droits, n'a pas été édité par l'homme, et n'assume aucune responsabilité juridique. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)