Los hilos AsyncTask nunca mueren

Estoy usando AsyncTask para obtener datos en respuesta al usuario presionando un botón. Esto funciona bien y mantiene la interfaz receptiva mientras obtengo los datos, pero cuando revisé lo que estaba sucediendo en el depurador Eclipse, descubrí que cada vez que se creaba una nueva AsyncTask (que es muy a menudo, porque solo se pueden usar) una vez), se estaba creando un nuevo hilo pero nunca se terminó.

El resultado es una gran cantidad de subprocesos AsyncTask simplemente sentados allí. No estoy seguro de si esto es un problema en la práctica o no, pero realmente me gustaría deshacerme de esos hilos adicionales.

¿Cómo puedo matar estos hilos?

AsyncTask administra un grupo de subprocesos, creado con ThreadPoolExecutor . Tendrá de 5 a 128 hilos. Si hay más de 5 subprocesos, esos subprocesos se mantendrán durante al menos 10 segundos antes de ser eliminados. (nota: estas cifras corresponden al código fuente abierto actualmente visible y varían según el lanzamiento de Android).

Deje los hilos AsyncTask solo, por favor.

Además de la respuesta de CommonsWare:

Actualmente estoy usando Android 2.2, y mi aplicación no usa más de una AsyncTask en ningún momento, pero estoy creando una nueva cada x minutos. Al principio, nuevos AsyncTask Threads comienzan a aparecer (un nuevo Thread para una nueva AsyncTask) pero después de 5 hilos (como lo menciona CommonsWare) simplemente permanecen visibles en la ventana de depuración y se vuelven a utilizar cuando se necesitan nuevos hilos AsyncTask. Simplemente permanecen allí hasta que el depurador se desconecte.

El mismo síntoma aquí. En mi caso, los hilos quedaron colgados después de matar la actividad, y esperaba que la aplicación se cerrara por completo. Problema parcialmente resuelto mediante el uso de un único ejecutor de hilos:

  myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor()); 

Esto hizo que el hilo desapareciera después de completar su trabajo.

Utilice 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); 

Publique su tarea Runnable utilizando el método execute () .

 void execute (Runnable command) 

Ejecuta la tarea dada alguna vez en el futuro. La tarea puede ejecutarse en un nuevo hilo o en un hilo agrupado existente

En cuanto a su segunda consulta:

¿Cómo puedo matar estos hilos?

Una vez que haya terminado con todo su trabajo con ThreadPoolExecutor , ThreadPoolExecutor como se ThreadPoolExecutor en la siguiente publicación:

Cómo cerrar correctamente el ExecutorService de Java