2012-09-13 9 views
9

Escribí una AsyncTask y la mayoría de las veces no hay ningún retraso entre su constructor llamado y su doInBackground ha sido llamado (0 ms de retraso). Pero siempre que la sincronización de contactos ocurre en el fondo, a menudo experimento de 1 a 3 segundos de retraso entre el constructor de AsyncTasks y doInBackground. Esta demora es inaceptable en mis circunstancias. Entiendo que AsyncTask es un hilo de fondo y que este problema se puede resolver usando Thread y estableciendo su prioridad más alta. Pero lo que quiero descubrir es, ¿cómo sé qué está causando que se llame a doInBackground de mi AsyncTask? Utilicé adb shell top -m 10 y el uso del proceso parece bastante normal cuando ocurre este problema.DoInBackground de AsyncTask comienza su ejecución demasiado tarde después de que AsyncTask :: execute se llame

Cualquier ayuda es apreciada.

gracias

+0

IMO, comúnmente se ejecutará inmediatamente, si hay otro hilo que se está ejecutando también, lo hará más lento así que es mejor que verifique sus hilos y los sincronice bien. – Tom

Respuesta

2

Por lo general, no se preocupan por la programación de tareas por la JVM. Y de hecho, no necesitamos molestarnos también.

Si necesita hacer algo lo más rápido posible en su aplicación, hágalo en el propio constructor o use onPre of Asynctask (Recuerde que se ejecuta en el hilo de UI).

Pero estoy de acuerdo en que hay algo sospechoso en la llamada doInBackgroud en Android AsyncTask yo mismo había sido testigo de que doInbackground no se llamaba después de onPre. Puedes googlear esto también. muchas personas lo enfrentaron. Me moví para usar el hilo tradicional.

Escribí mi propia Asynctask usando hilo tradicional en el núcleo y para imitar onPre y onPost utilicé Handler. Puedes ir por esa opción también.

1

Es importante distinguir entre crear y ejecutar la tarea. (Un ASyncTask tiene un método separado execute(), así como un constructor, como habrán notado.)

Creación de un hilo es potencialmente muy costosa, por lo que podría encontrar que la creación de la tarea de antemano, y sólo entonces ejecutarlo en el tiempo correcto, da mejores resultados.

Si es probable que la operación en segundo plano se repita a menudo, también puede encontrar que un IntentService, que maneja las solicitudes de uno a uno en una cadena de fondo, es más adecuado.

30

También me enfrento a este problema durante un período prolongado, pero ahora está resuelto. Utilice el código de abajo

new AsyncTaskName().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

en lugar del código

new AsyncTaskName().execute(); 

que resolvería el problema de correr doInbackground tarde.

+1

esto funcionó perfectamente para mí. tenga en cuenta que esto se agregó en la API 11 y la advertencia de: 'http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutorjava.util.concurrent.Executor, Params ...)' – Jayrox

+1

It Cabe señalar que executeOnExecutor no se puede utilizar con la versión de la API anterior como 11. Ver hilo http://stackoverflow.com/questions/9119627/android-sdk-asynctask-doinbackground-not-running-subclass/23678665#23678665 –

+0

@ Milan Shukla: muchas gracias :-) –

Cuestiones relacionadas