Estoy usando AsyncTask
s para obtener datos en respuesta a que el usuario presione un botón. Esto funciona bien y mantiene la interfaz receptiva mientras se obtienen los datos, pero cuando verifiqué lo que estaba sucediendo en el depurador de Eclipse, descubrí que cada vez que AsyncTask
se creaba uno nuevo (lo cual es bastante frecuente, porque solo se pueden usar una vez ), se estaba creando un nuevo hilo pero nunca se terminó.
El resultado es una gran cantidad de AsyncTask
hilos ahí. 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?
android
multithreading
android-asynctask
Computarizado
fuente
fuente
doInBackground
método se completa, pero el hilo continúa apareciendo en la ventana de depuración. Por ejemplo:Thread [<23> AsyncTask #4](Running)
Respuestas:
AsyncTask
administra un grupo de subprocesos, creado conThreadPoolExecutor
. Tendrá de 5 a 128 hilos. Si hay más de 5 hilos, esos hilos adicionales se mantendrán durante un máximo de 10 segundos antes de ser eliminados. (nota: estas cifras son para el código fuente abierto actualmente visible y varían según la versión de Android).Deje los
AsyncTask
hilos en paz, por favor.fuente
AsyncTask
para algo que tomaría tanto tiempo es una mala idea en general. Pero no, mi comentario sobre la desaparición de hilos adicionales es cuando no se utilizan. Entonces, cuando una de sus 6 tareas finaliza, su hilo permanecerá en el grupo durante 10 segundos, después de lo cual ese hilo terminará.AsyncTask
actualidad no es un gran plan. Tener más de 20 que pueden durar más de 10 segundos es el tipo de cosas que deberían fallar en una revisión de código. Si crea 20 tareas en rápida sucesión, solo unas pocas se ejecutarán a la vez y el resto se pondrá en cola para su ejecución posterior. La cantidad que se ejecutará a la vez se basa en la cantidad de núcleos de la CPU. AFAIK, el algoritmo actual es 2N + 1 hilos paralelos, donde N es el número de núcleos.Además de la respuesta de CommonsWare:
Actualmente estoy usando Android 2.2 y mi aplicación no usa más de una AsyncTask a la vez, pero estoy creando una nueva cada x minutos. Al principio, comienzan a aparecer nuevos subprocesos AsyncTask (un nuevo subproceso para un nuevo AsyncTask) pero después de 5 subprocesos (como lo menciona CommonsWare) simplemente permanecen visibles en la ventana de depuración y se reutilizan cuando se necesitan nuevos subprocesos AsyncTask. Simplemente permanecen allí hasta que el depurador se desconecta.
fuente
El mismo síntoma aquí. En mi caso, los hilos quedaron colgados después de que maté la actividad, y esperaba que la aplicación se cerrara por completo. Problema parcialmente resuelto mediante el uso de un ejecutor de un solo hilo:
Esto hizo que el hilo se desvaneciera después de completar su trabajo.
fuente
Utilice ThreadPoolExecutor .
Publique su
Runnable
tarea utilizando el método execute () .Respecto a su segunda consulta:
Una vez que haya terminado con todo su trabajo con
ThreadPoolExecutor
, apáguelo correctamente como se cita en la siguiente publicación:Cómo apagar correctamente Java ExecutorService
fuente