Android: Annuler Une Tâche Asynchrone
- Je utiliser un async tâche de charger une image et obtenir certains résultats.
Pendant le chargement de l'image, je vois une boîte de dialogue de progression, écrit en onPreExecute() la méthode comme ceci:
protected void onPreExecute() {
uploadingDialog = new ProgressDialog(MyActivity.this);
uploadingDialog.setMessage("uploading");
uploadingDialog.setCancelable(true);
uploadingDialog.show();
}
Ok lorsque j'appuie sur le bouton de retour, évidemment, la boîte de dialogue disparaît en raison de la setCancelable(true).
Mais (évidemment), le async tâche ne s'arrête pas.
Alors, comment puis-je résoudre ce problème? Je veux annuler les deux dialogue et async task lorsque j'appuie sur le bouton retour. Des idées?
EDIT: TROUVÉ LA SOLUTION. VOIR MA RÉPONSE CI-DESSOUS.
- Ce tutoriel a résolu mon problème sur AsyncTask, l'Annulation de AsyncTask aussi AsyncTask Android Exemple
Vous devez vous connecter pour publier un commentaire.
De SDK:
De sorte que votre code est bon pour boîte de dialogue de l'auditeur:
Maintenant, comme je l'ai mentionné précédemment, à partir de SDK, vous devez vérifier si la tâche est annulée ou pas, pour que vous devez vérifier isCancelled() à l'intérieur de la onPreExecute() la méthode.
Par exemple:
TROUVÉ LA SOLUTION:
J'ai ajouté une action de l'auditeur avant de uploadingDialog.show() comme ceci:
De cette façon, lorsque j'appuie sur le bouton de retour, le ci-dessus OnCancelListener annule à la fois dialogue et de la tâche. Vous pouvez également ajouter finish() si vous voulez terminer l'ensemble de l'activité sur le dos appuyé. N'oubliez pas de déclarer votre async tâche comme une variable comme ceci:
et d'exécuter votre tâche asynchrone comme ceci:
show
méthode qui accepte d'annuler l'auditeur comme l'un de ses paramètres.J'ai passé tout en essayant de se faire, tout ce que je voulais, c'était un simple exemple de comment le faire, donc je pensais que je poste comment je l'ai fait. C'est un code qui met à jour une bibliothèque et dispose d'une boîte de dialogue de progression montrant combien de livres ont été mis à jour et annule lorsqu'un utilisateur ferme la boîte de dialogue:
créer des variables de membre dans votre activité comme
de les utiliser pour vos dialogue et de la tâche;
dans onPause (), il suffit d'appeler
Je voudrais améliorer le code. Lorsque vous canel le
aSyncTask
laonCancelled()
(méthode de rappel deaSyncTask
) est automatiquement appelé, et il vous pouvez masquer votreprogressBarDialog
.Vous pouvez inclure ce code:
La plupart du temps que j'utilise AsyncTask ma logique d'entreprise est sur un coin de la classe affaires au lieu de l'être sur l'INTERFACE utilisateur. Dans ce cas, je ne pouvais pas avoir une boucle à doInBackground(). Un exemple serait un processus de synchronisation qui consomme des services et de conserver des données à l'un après l'autre.
Je remettre ma tâche à l'objet de l'entreprise de sorte qu'il peut manipuler à l'annulation. Ma configuration est la suivante:
Vous pouvez simplement demander une annulation, mais pas vraiment d'y mettre fin. Voir ce réponse.
J'ai eu un problème similaire - en fait, j'ai été prendre une NPE dans un async task après que l'utilisateur a détruit l'activité. Après des recherches sur le problème de Débordement de Pile, j'ai adopté la solution suivante:
Ensuite, je vérifie "si l'exécution de" périodiquement dans mon code asynchrone. J'ai mis à l'épreuve, et je suis maintenant incapable de "casser" mon activité. Cela fonctionne parfaitement et a l'avantage d'être plus simple que certaines des solutions que j'ai vu sur DONC.
Comment annuler AsyncTask
Réponse complète est ici - Android AsyncTask Exemple
AsyncTask fournit une meilleure annulation de la stratégie, pour terminer la tâche en cours d'exécution.
annuler(boolean mayInterruptIfitRunning)
matache.annuler(faux)- Il fait isCancelled renvoie la valeur true. Permet d'annuler la tâche.
matache.annuler(vrai) – Il permet aussi isCancelled() renvoie true, interrompre le thread d'arrière-plan et soulage les ressources .
Il est considéré comme un arrogant, Si il y a n'importe quel thread.sleep() la méthode d'exécution dans le thread d'arrière-plan, d'annuler(vraie) interrompre le thread d'arrière-plan à cette époque. Mais annuler(false) va l'attendre et annuler la tâche lorsque cette méthode est terminée.
Si vous appelez annuler() et doInBackground() n'a pas commencé à exécuter encore. onCancelled() appellera.
Après avoir invoqué annuler(...) vous devriez vérifier la valeur retournée par isCancelled() sur doInbackground() périodiquement. comme indiqué ci-dessous.