android - tutorial - Los hilos AsyncTask nunca mueren
thread android (4)
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.
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?
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<Runnable>(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:
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.