Le mentionné dans les commentaires de cas qu' isCancelled() always returns false even i call asynctask.cancel(true);
est particulièrement dangereux si je ferme mon application, mais l'AsyncTask continue de travailler.
Pour résoudre ce j'ai modifié le projet en Jacob Nordfalk
code de la façon suivante:
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled() || (FlagCancelled == true)) break;
}
return null;
}
et ajouté ce qui suit à l'activité principale:
@Override
protected void onStop() {
FlagCancelled = true;
super.onStop();
}
Comme mon AsyncTask est une classe privée de l'un des points de vue, de sorte que les accesseurs ou compositeurs du drapeau ont été nécessaires pour informer les AsyncTask sur le réel valeur de l'indicateur.
Mes multiples tests (AVD Android 4.2.2, l'Api 17) ont montré que si une AsyncTask est déjà en cours d'exécution de son doInBackground
, alors isCancelled()
réagit en aucune façon (c'est à dire continue d'être faux) à toute tentative visant à annuler, par exemple lors d' mViewGroup.removeAllViews();
ou au cours d'une OnDestroy
de la MainActivity
, chaque de ce qui conduit au détachement de vues
@Override
protected void onDetachedFromWindow() {
mAsyncTask.cancel(false); // and the same result with mAsyncTask.cancel(true);
super.onDetachedFromWindow();
}
Si j'arrive à forcer l'arrêt de l' doInBackground()
grâce à l'introduction de FlagCancelled
, alors onPostExecute()
est appelé, mais ni onCancelled()
ni onCancelled(Void result)
(depuis l'API de niveau 11) ne sont pas invoquées. (Je n'ai aucune idée pourquoi, parce qu'ils doivent être invoquée et onPostExecute()
ne devrait pas, "API Android doc a dit:l'Appel de la méthode cancel() garantit que onPostExecute(Objet) n'est jamais appelée." - IdleSun
, répondant à une question similaire).
En revanche, si le même AsyncTask n'avais pas commencé son doInBackground()
avant d'annuler, alors tout est ok, isCancelled()
changements de vrai et je peut vérifier que dans
@Override
protected void onCancelled() {
Log.d(TAG, String.format("mAsyncTask - onCancelled: isCancelled = %b, FlagCancelled = %b", this.isCancelled(), FlagCancelled ));
super.onCancelled();
}