2010-06-19 15 views
113

Estoy usando AsyncTask s 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 un nuevo AsyncTask (que es muy a menudo, porque solo se pueden usar) una vez), se estaba creando un nuevo hilo pero nunca se terminó.Subprocesos AsyncTask nunca mueren

El resultado es un gran número de hilos AsyncTask que acaban de sentarse 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 eliminar estos hilos?

+0

¿Qué quiere decir con "no terminado"? ¿La tarea nunca finaliza su método doInbackground o simplemente ve el objeto asynctask en el traker de asignación? –

+7

El método 'doInBackground' se completa, pero el subproceso continúa apareciendo en la ventana de depuración. Por ejemplo: 'Tema [<23> AsyncTask # 4] (En ejecución)' – Computerish

Respuesta

199

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 solos, por favor.

+0

uff! ¡Bueno oír eso! jeje :) –

+0

¡Gracias por la explicación! Me alegra saber que no estoy haciendo nada mal. Por curiosidad, ¿por qué está diseñado así? ¿Por qué no termina los hilos una vez que todos los métodos han vuelto? – Computerish

+7

Presumiblemente para ahorrar tiempo bifurcando los hilos en solicitudes posteriores. – CommonsWare

23

Además de la respuesta de CommonsWare:

Actualmente estoy usando Android 2.2, y mi aplicación utiliza no más de un AsyncTask en cualquier momento, pero yo estoy creando uno nuevo 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.

+2

Sí, confirmado: Veo no más de 5 AsyncTasks. –

3

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 resuelto en parte mediante el uso de un único ejecutor roscado:

myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor()); 

Esto hizo que el hilo a desaparecer después de la de completar su trabajo.

+0

Esta respuesta hizo que AsyncTask desapareciera después de ejecutarse, quizás no sea la "forma de hacer Google de google", pero hace el trabajo bien. Gracias. –

+0

Esto resolvió mi problema específico con la ejecución de Asynctasks en un único hilo. –

0

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

Publica tu Runnable tarea mediante execute() método.

void execute (Runnable command) 

ejecuta la tarea dada en algún momento en el futuro. La tarea puede ejecutar en un nuevo hilo o en un hilo combinado existente

En cuanto a su segunda pregunta:

¿Cómo puedo matar a estos temas?

Una vez que haya terminado con todo su trabajo con ThreadPoolExecutor, apagado correctamente como se cita a continuación en el mensaje:

How to properly shutdown java ExecutorService