AsyncTask.onCancelled() n'est pas appelée après l'annuler(vrai)
Android SDK v15 en cours d'exécution sur un 2.3.6 appareil.
Je vais avoir un problème où les onPostExecute()
est encore appelée lorsque je fais appel cancel()
dans un doInBackground()
appel.
Voici mon code:
@Override
public String doInBackground(String... params) {
try {
return someMethod();
} catch (Exception e) {
cancel(true);
}
return null;
}
public String someMethod() throws Exception {
...
}
Je suis forcer someMethod()
lancer une exception pour un test, et au lieu de onCancelled appelle, je reviens toujours à la onPostExecute()
. Si je vérifie isCancelled()
la valeur renvoyée est true, alors je sais qu' cancel(true)
est en cours d'exécution.
Des idées?
OriginalL'auteur PolandSpring | 2012-06-23
Vous devez vous connecter pour publier un commentaire.
Selon l'API Android document,
onCancelled()
qui est là depuis l'API de niveau 3, tandis queonCancelled(Object result)
a été ajouté que depuis l'API de niveau 11. À cause de cela, si la plate-forme de l'API de niveau est en dessous de 11,onCancelled()
sera invoquée toujours toutonCancelled(Object)
sera invoquée toujours autrement.Donc, si vous voulez exécuter votre code sur toutes les API de niveau 3 et plus, vous avez besoin pour mettre en œuvre les deux méthodes. Afin d'avoir le même comportement que vous pouvez stocker le résultat dans une variable d'instance, de sorte que
isCancelled()
peut être utilisé comme indiqué ci-dessous:Par la voie, le code de Eric ne sont pas susceptibles de travailler parce que l'API Android doc a dit:
Bonne réponse, mais le nom de la méthode existe une faute de frappe. Je suppose qu'il doit être "handleOnCancelled".
L'appel de la méthode cancel() garantit que onPostExecute(Objet) n'est jamais invoquée, c'est juste pour le nid d'abeilles et plus tard pour les versions antérieures reportez-vous à @eric réponse
OriginalL'auteur IdleSun
onCancelled
est uniquement pris en charge depuis l'API Android niveau 11 (Honeycomb 3.0.x). Cela signifie que, sur un Android 2.3.6 appareil, il ne sera pas appelé.Votre meilleur pari est de cela
onPostExecute
:Si vous voulez éviter la vérification de version, vous pouvez faire au lieu de:
Espère que ça aide! 🙂
Je n'ai aucune idée du code que vous utilisez ou la tâche que vous essayez d'accomplir. Vous seriez probablement préférable de commencer une nouvelle question si vous avez essayé de faire quelque chose de semblable à cela et recevez des problèmes.
mon point est que je ne peut pas @ override la onCancelled(SomeType) et la simple onCancelled(). Aussi, si je suis cibler vieille version d'Android, onCancelled() ne sera pas appelée à tous les...
C'est l'ensemble de point de ce post, afin que vous appelez
onCancelled()
manuellement si vous êtes en cours d'exécution sur les anciennes versions d'Android. En outre, ne cible pas les anciennes versions (c'est pourquoi vous ne pouvez pas remplacer). Votre objectif doit être le dernier SDK, et votre minimum SDK doit être celui qui est le plus bas que vous souhaitez soutenir.J'ai eu le même problème et votre réponse a ouvert heavens gate 🙂 +1
OriginalL'auteur Eric