AsyncTask sera toujours exécuté même si l'application est détruite?
J'ai une demande à et parce que vous ne pouvez pas effectuer les opérations de réseau sur le thread principal, je suis en utilisant AsyncTask
donc la question est une fois que j'ai execute()
la AsyncTask
et juste après que je finish()
l'activité, et peut-être de l'utilisateur finish()
l'ensemble de l'application, de sorte que je me pose, c'est:
- Sera
AsyncTask
toujours finirdoInBackground()
etonPostExecute()
même si l'application est fermée aussi longtemps queexecute()
a été appelée lorsque l'application est en cours d'exécution?
source d'informationauteur JRowan
Vous devez vous connecter pour publier un commentaire.
Vous serez en mesure de tester cela. Et oui, C'est fait. Si l'exécution a été appelé, vous pouvez voir Asynctask exécute tout de même, SAUF si elle fait quelque chose à la présente ou de l'INTERFACE utilisateur liée. (cela peut entraîner un lanceur de crash).
Cependant, s'il était proche par le système. Il peut ou peut ne pas poursuivre l'exécution de la méthode. J'ai déjà testé et a répondu à ici.
Répondre au commentaire:
Testé:
onPostExecute()
est appelé par le thread d'INTERFACE utilisateur - si le thread d'INTERFACE utilisateur n'est plus en cours d'exécution, il ne va pas continuer à exécuter. CependantdoInBackGround()
est exécuté à partir d'un autre thread de travail afin de s'en jusqu'à ce que fait (ou si la JVM est tué par l'OS, qui est aussi une possibilité). Notez que AsyncTasks sont uniquement recommandés pour les plus courtes de l'INTERFACE utilisateur lié à des tâches de fond et pas longtemps l'exécution de tâches d'arrière-plan (quelques secondes).En bref, vous ne pouvez pas supposer qu'il continuera sur et certainement pas supposer qu'il va publier ses progrès ou appelez
onPostExecute()
.Lorsque vous appelez finish() sur l'Activité, l'Activité est détruite, mais le thread principal ne l'est pas. [NOTE: l'Activité s'exécute sur le Thread Principal. L'activité n'est pas Thread Principal. ]
Donc, doInBackground() sur le thread d'arrière-plan et onPostExecute() sur le thread principal sera exécuté. Toutefois, si onPostExecute() n'a aucun liées à l'INTERFACE utilisateur des tâches, vous obtiendrez de l'ANR, car il n'y a pas d'INTERFACE utilisateur à ce point.
Par exemple, si vous avez juste l'impression d'un Journal.d() à l'intérieur de onPostExecute(), la déclaration sera visible dans le Logcat.
** Ce sera possible seulement si le processus est vivant, & n'est pas tué par Android Bas de la Mémoire du Tueur.
Voir l'image pour voir les méthodes qui sont exécutées dans le thread.
Vous pouvez facilement tester cela, il suffit de faire
doInBackground()
durer plus longtemps, par exemple, ajouterThread.sleep(5000)
et puis essayer différents scénarios :onPostExecute()
si vous détenez une référence à l'Activité environnante (comme un élément de l'INTERFACE utilisateur), qui n'est pas "vivant".onPostExecute()
doInBackground()
ne sera pas effectuée. Il en va de même si vous commencez simplement le fil à l'aide denew Thread(new Runnable() {...