uso una tiempo termine tarea studio runonuithread que peticiones hilos esperar ejecutar definicion como cierto cada asynctask asincronos asincronas android android-asynctask

android - una - runonuithread vs asynctask



DoInBackground de AsyncTask comienza su ejecución demasiado tarde después de llamar a AsyncTask:: execute (3)

Escribí un 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 cuando la sincronización de contactos ocurre en el fondo, a menudo experimento un retraso de 1-3 segundos 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? Usé adb shell top -m 10 y el uso del proceso parece bastante normal cuando ocurrió este problema.

Cualquier ayuda es apreciada.

Gracias


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

Crear un hilo es potencialmente bastante costoso, por lo que es posible que al crear la tarea por adelantado y luego ejecutarlo solo en el momento correcto, se obtengan mejores resultados.

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


Por lo general, no nos preocupamos por la programación de tareas por parte de 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 llamó 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.


También me enfrento a este tema por un largo período, pero ahora está resuelto. Usa el siguiente código

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

en cambio, el código

new AsyncTaskName().execute();

resolvería el problema de ejecutar doInbackground tarde.