Android AsyncTask no se llama durante minutos en ICS

Tengo una aplicación que usa muchas AsyncTasks, el problema que tengo es que una tarea particularmente importante no se inicia hasta un par de minutos después de llamar a ejecutar.

Si uso lo siguiente para mis dispositivos ICS, funciona;

if(Build.VERSION.SDK_INT >= 11)
{
  myTask.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, stuff );
}

a diferencia de esto en pre-ICS;

myTask.execute(stuff);

Soy consciente de que ICS ha cambiado la ejecución del subproceso para que se serialice, pero no puedo entender qué está retrasando la cola del subproceso.

Hay alrededor de 20 subprocesos enumerados en depuración en eclipse, pero he leído que tal vez esto no sea correcto ya que el depurador tiende a seguir mostrando los que realmente no están allí.

¿Cómo averiguo qué subprocesos están retrasando la cola serializada para no tener que cambiar el valor predeterminado en ICS, y tal vez incluso mejorar el rendimiento de los dispositivos anteriores a ICS que no están viendo los problemas debido al ejecutor del grupo de subprocesos? siendo el comportamiento predeterminado.

preguntado el 12 de junio de 12 a las 17:06

Por favor, no corrijan mi inglés británico a inglés americano, y ciertamente no agreguen más errores tipográficos. :D -

¿Siempre tarda el mismo tiempo en arrancar o varía? -

es variado, algunas veces se ejecutará instantáneamente, como se esperaba, otras tendré que esperar un par de minutos. Aunque no parece haber un punto intermedio, es instantáneo o x (sin contar) minutos. -

1 Respuestas

¿Cómo averiguo qué subprocesos están retrasando la cola serializada?

Añada Log declaraciones para realizar un seguimiento de la entrada y salida de la correspondiente doInBackground() métodos.

y tal vez incluso mejore el rendimiento de los dispositivos anteriores a ICS que no están viendo los problemas debido a que el ejecutor del grupo de subprocesos tiene un comportamiento predeterminado.

No necesitas usar AsyncTask. Solo bifurca tu propio hilo y usa cosas como runOnUiThread() como un medio para ejecutar la lógica en el subproceso principal de la aplicación. AsyncTask es una conveniencia, no un requisito. Y, para una tarea atípica de alta prioridad, puede tener más sentido para usted simplemente mantenerla alejada de cualquier contención del grupo de subprocesos.

O, clonar y bifurcar AsyncTask utilizar una PriorityQueue, para que pueda indicar explícitamente sus tareas de alta prioridad.

Respondido el 12 de junio de 12 a las 18:06

Gracias CW, lo pondré a prueba. - Hamid

Esto ciertamente me ayudó a descubrir la causa, parece que una de mis AsyncTasks haciendo comunicaciones con un DefaultHttpClient no está terminando por mucho tiempo. Tengo establecidos tiempos de espera de conexión y socket en este cliente, por lo que no puedo averiguar qué está retrasando la tarea, los tiempos de espera son cortos, uno o dos segundos. Además, parece que solo hace esto en HTC Sensation con ICS 4.0.3, las pruebas en un Galaxy S2 4.0.3 funcionan bien. - Hamid

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.