J'utilise AsyncTask
s pour récupérer des données en réponse à l'utilisateur qui appuie sur un bouton. Cela fonctionne bien et maintient l'interface réactive lors de la récupération des données, mais lorsque j'ai vérifié ce qui se passait dans le débogueur Eclipse, j'ai découvert qu'à chaque fois qu'un nouveau AsyncTask
était créé (ce qui est assez souvent, car ils ne peuvent être utilisés qu'une seule fois) ), un nouveau thread était en cours de création mais ne s'est jamais terminé.
Le résultat est un grand nombre de AsyncTask
threads assis juste là. Je ne sais pas si c'est un problème dans la pratique ou non, mais j'aimerais vraiment me débarrasser de ces fils supplémentaires.
Comment puis-je tuer ces fils?
android
multithreading
android-asynctask
Informatisé
la source
la source
doInBackground
méthode se termine, mais le thread continue à apparaître dans la fenêtre de débogage. Par exemple:Thread [<23> AsyncTask #4](Running)
Réponses:
AsyncTask
gère un pool de threads, créé avecThreadPoolExecutor
. Il aura de 5 à 128 threads. S'il y a plus de 5 fils, ces fils supplémentaires resteront autour pendant au plus 10 secondes avant d'être supprimés. (Remarque: ces chiffres concernent le code open source actuellement visible et varient selon la version d'Android).Laissez les
AsyncTask
fils tranquilles, s'il vous plaît.la source
AsyncTask
pour quelque chose qui prendrait autant de temps est une mauvaise idée en général. Mais non, mon commentaire sur la disparition des fils supplémentaires concerne le moment où ils ne sont pas utilisés. Ainsi, quand l'une de vos 6 tâches se termine, son thread restera dans le pool pendant 10 secondes, après quoi ce thread sera terminé.AsyncTask
aujourd'hui n'est pas un bon plan. Avoir 20+ qui peuvent fonctionner pendant plus de 10 secondes est le genre de chose qui devrait échouer à une révision de code. Si vous créez 20 tâches en succession rapide, seules quelques-unes seront exécutées à la fois et le reste sera mis en file d'attente pour une exécution ultérieure. Le nombre d'exécutions simultanées dépend du nombre de cœurs du processeur. AFAIK, l'algorithme actuel est 2N + 1 threads parallèles, où N est le nombre de cœurs.En plus de la réponse de CommonsWare:
Actuellement, j'utilise Android 2.2 et mon application n'utilise pas plus d'une AsyncTask à la fois, mais j'en crée une nouvelle toutes les x minutes. Au début, de nouveaux threads AsyncTask commencent à apparaître (un nouveau thread pour un nouvel AsyncTask) mais après 5 threads (comme mentionné par CommonsWare), ils restent simplement visibles dans la fenêtre de débogage et sont réutilisés lorsque de nouveaux threads AsyncTask sont nécessaires. Ils restent simplement là jusqu'à ce que le débogueur se déconnecte.
la source
Même symptôme ici. Dans mon cas, les fils ont traîné après avoir tué l'activité et j'espérais que l'application se ferme complètement. Problème partiellement résolu en utilisant un seul exécuteur threadé:
Cela a fait disparaître le fil une fois son travail terminé.
la source
Utilisez ThreadPoolExecutor .
Publiez votre
Runnable
tâche en utilisant la méthode execute () .Concernant votre deuxième requête:
Une fois que vous avez terminé tout votre travail avec
ThreadPoolExecutor
, arrêtez-le correctement comme indiqué dans le post ci-dessous:Comment arrêter correctement Java ExecutorService
la source