Question

J'utilise un AsyncTask sous-classe pour un traitement en arrière-plan.Le problème est que lorsque j'utilise la classe avec le .get() méthode, le ProgressDialog je précise dans le onPreExecute() ne montre pas.

Cela fonctionne bien si j'utilise un rappel dans le onPostExecute() méthode.

Ma première pensée a été que c'était parce que .get() attend la fin du processus, mais cela ne peut pas non plus bloquer le thread de l'interface utilisateur, ce n'est donc pas le cas.

Quelqu'un peut-il expliquer pourquoi ce comportement est ainsi et s'il existe une solution de contournement pour cela ??J'aimerais vraiment utiliser le .get() méthode si je peux.

Était-ce utile?

La solution

J'ai d'abord accepté l'autre réponse mais elle semble fausse.

Le .get() La méthode bloquera le thread de l'interface utilisateur pour attendre le résultat et toutes les boîtes de dialogue affichées seront également bloquées.C'est le comportement attendu pour cette méthode.

La seule alternative est de ne pas utiliser .get() si l'activité en arrière-plan dure une durée notable et utilisez plutôt des méthodes de rappel pour l'activité appelante.

Autres conseils

Appel AysncTask.get() sur le thread d'interface utilisateur bloquera l'exécution du thread d'interface utilisateur et fera en sorte que le thread d'interface utilisateur attende la fin d'AysncTask.doInBackground().En faisant cela, vous sacrifiez en fait l'avantage d'AsycnTask, tout le code est désormais exécuté de manière synchrone dans le thread d'interface utilisateur et le thread d'arrière-plan (toujours deux threads, mais le thread d'interface utilisateur attend maintenant le thread d'arrière-plan).

Gardez également à l’esprit que vous obtiendrez probablement une exception ANR (bloquée pendant plus de 5 secondes) en appelant get() sur le thread de l’interface utilisateur.

Si vous devez vraiment l'utiliser, appelez votre méthode showDialog() avant myAsyncTask.get() :

showDialog();
myAsyncTask.execute();
myAsyncTask.get(); // <-- UI thread blocked and wait at this point.
dismissDialog();// <-- This line will be executed after doInBackground() finish.

J'espère que cela t'aides.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top