Les threads AsyncTask ne meurent jamais

J’utilise AsyncTask pour récupérer des données en réponse à une pression sur un bouton. Cela fonctionne bien et maintient l’interface réactive lors de l’extraction des données, mais lorsque j’ai vérifié ce qui se passait dans le débogueur d’Eclipse, j’ai découvert qu’à chaque fois qu’une nouvelle AsyncTask était créée (ce qui est souvent le cas une fois), un nouveau thread était en cours de création mais jamais terminé.

Le résultat est un grand nombre de threads AsyncTask juste assis là. Je ne suis pas sûr que ce soit un problème dans la pratique ou non, mais je voudrais vraiment me débarrasser de ces fils supplémentaires.

Comment puis-je tuer ces threads?

AsyncTask gère un pool de threads, créé avec ThreadPoolExecutor . Il aura de 5 à 128 threads. S’il y a plus de 5 threads, ces threads supplémentaires restront au maximum 10 secondes avant d’être retirés. (note: ces chiffres concernent le code source ouvert actuellement visible et varient selon la version d’Android).

Laissez les threads AsyncTask seuls, s’il vous plaît.

En plus de la réponse de CommonsWare:

Actuellement, j’utilise Android 2.2 et mon application n’utilise pas plus d’une AsyncTask à tout moment, mais j’en crée une toutes les x minutes. Au début, les nouveaux threads AsyncTask commencent à apparaître (un nouveau thread pour une nouvelle AsyncTask) mais après 5 threads (comme mentionné par CommonsWare), ils restnt visibles dans la fenêtre de débogage et sont réutilisés lorsque de nouveaux threads AsyncTask sont nécessaires. Ils restnt juste là jusqu’à ce que le débogueur se déconnecte.

Même symptôme ici. Dans mon cas, les fils se sont penchés après avoir tué l’activité et j’espérais que l’application se ferment complètement. Problème partiellement résolu en utilisant un seul exécuteur d’exécution:

  myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor()); 

Cela a fait disparaître le fil après la fin de son travail.

Utilisez ThreadPoolExecutor .

 BlockingQueue workQueue= new LinkedBlockingQueue(100); // Work pool size ThreadPoolExecutor executor = new ThreadPoolExecutor( Runtime.getRuntime().availableProcessors(), // Initial pool size Runtime.getRuntime().availableProcessors(), // Max pool size 1, // KEEP_ALIVE_TIME TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT workQueue); 

Publiez votre tâche Runnable en utilisant la méthode execute () .

 void execute (Runnable command) 

Exécute la tâche donnée dans le futur. La tâche peut s’exécuter dans un nouveau thread ou dans un thread groupé existant

Concernant votre deuxième requête:

Comment puis-je tuer ces threads?

Une fois que vous avez terminé votre travail avec ThreadPoolExecutor , ThreadPoolExecutor -le correctement, comme indiqué dans la publication ci-dessous:

Comment arrêter correctement java ExecutorService