46 votes

Règle de filetage AsyncTask - Peut-on vraiment l'utiliser une seule fois ?

Dans le documentation sur AsyncTask il donne ce qui suit comme règle relative à l'enfilage :

  • La tâche ne peut être exécutée qu'une seule fois (une exception sera levée si une deuxième exécution est tentée).

Tout cela signifie que vous devez créer une nouvelle instance de la classe chaque fois que vous voulez l'utiliser, n'est-ce pas ? En d'autres termes, il faut faire comme ceci :

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);

Ou inversement, vous ne pouvez PAS faire ce qui suit :

DownloadFilesTask dfTask = new DownloadFilesTask();
dfTask().execute(url1, url2, url3);
dfTask().execute(url4, url5, url6);

Quelqu'un peut-il vérifier que cette interprétation est exacte ?

Je me rends compte que j'ai répondu à cette question par moi-même en écrivant ce texte... Mais ce n'était pas immédiatement évident pour moi, alors je pense qu'il serait utile de l'afficher quand même.

101voto

CommonsWare Points 402670

Quelqu'un peut-il vérifier que c'est un exacte ?

C'est une interprétation très précise.

7voto

Il y a un autre problème avec AsyncTasks. Veuillez noter que dans l'exemple

new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);

exécuté sur Android 3+ (API niveau 11, HONEYCOMB) url1 y url4 ne sera pas être téléchargés en parallèle. En particulier, si l'on contacte url1 va s'interrompre, le transfert sur url4 ne démarrera même pas jusqu'à ce qu'il s'arrête. À moins que vous ne spécifiiez explicitement le contraire, toutes les AsyncTasks sont gérées par le même thread de travail unique.

Les docteurs disent :

Ordre d'exécution

Lors de leur introduction, les AsyncTasks étaient exécutées en série sur un seul thread d'arrière-plan. À partir de DONUT, cela a été remplacé par un pool de threads permettant à plusieurs tâches de fonctionner en parallèle. À partir de HONEYCOMB, les tâches sont exécutées sur un seul thread afin d'éviter les erreurs d'application courantes causées par l'exécution parallèle.

Si vous voulez vraiment une exécution parallèle, vous pouvez invoquer executeOnExecutor(java.util.concurrent.Executor, Object[]) avec THREAD_POOL_EXECUTOR .

-10voto

Carol Points 152

Les documents de Google/Android sont TRÈS trompeurs. Elle prétend qu'elle peut PAS être exécuté à nouveau. Période.

C'est tout simplement faux.

Je ne peux que me demander combien d'innombrables personnes pensent que "une seule fois" signifie "une seule fois". Ce n'est pas le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X