Asynctask vs Thread en android

135

En la interfaz de usuario, para realizar algunos trabajos en segundo plano, utilicé otro Thread. Pero como lo sugirieron otros, ahora estoy usando AsyncTask.

¿Cuál es la principal diferencia entre ay Threadan AsyncTask?

¿En qué escenario, debo usar a Threado an AsyncTask?

RAM
fuente
@ webaldo.at Me referí a esto, aquí me dieron una descripción y diferencia entre Asynctask y Thread. Quiero saber qué caso, por ejemplo, la conexión de red, ¿leer el archivo para lo que uso?
Ram
Acortado: Subproceso -> Sin acceso al subproceso de interfaz de usuario || Asynctask -> Acceso condicional al UI-Thread
JavaDM
para la tarea en segundo plano IntentService es otra buena opción.
Chen
1
Posible duplicado de Handler vs AsyncTask vs Thread
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

146

Para tareas de larga duración o uso intensivo de CPU, existen básicamente dos formas de hacerlo: subprocesos de Java y AsyncTask nativo de Android.

Ninguno de los dos es necesariamente mejor que el otro, pero saber cuándo usar cada llamada es esencial para aprovechar el rendimiento del sistema en su beneficio.

Use AsyncTask para:

  1. Operaciones de red simples que no requieren la descarga de muchos datos.
  2. Tareas vinculadas a disco que pueden tomar más de unos pocos milisegundos

Utilice hilos de Java para:

  1. Operaciones de red que involucran cantidades moderadas a grandes de datos (ya sea cargando o descargando)
  2. Tareas de CPU alta que deben ejecutarse en segundo plano
  3. Cualquier tarea en la que desee controlar el uso de la CPU en relación con el hilo de la GUI

Y hay muchos buenos recursos en Internet que pueden ayudarlo:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

Mohit
fuente
¿Puedo preguntar por qué la cantidad de datos de descarga es un problema?
Yeung
1
¡@Yeung parece que necesita información sobre la tarea asíncrona! Mire, mayor es la cantidad de datos y luego claramente mayor el tiempo necesario para completar la misma operación. Por lo tanto, no es una buena práctica hacer un proceso de larga duración utilizando la Tarea Asíncrona debido a las siguientes razones: 1. La Tarea Asíncrona está poco vinculada al ciclo de vida de la Actividad. 2. Crean fugas de memoria.
Mohit
3
Eche un vistazo a esto: stackoverflow.com/questions/12797550/…
Mohit
Gracias. Entiendo el riesgo ahora.
Yeung
La cantidad de datos de @Impasse @Yeung IMO no es un problema, el problema clave con las operaciones de red es el momento de la operación. Incluso la descarga de unos pocos bytes puede llevar mucho tiempo, cuando el servidor está ocupado, no se puede acceder (tiempo de espera), etc. Una solución podría ser usar AsyncTaskcon el propio programador.
xmedeko
44

Si usa hilos Java, debe manejar los siguientes requisitos en su propio código:

Sincronización con el hilo principal si publica resultados en la interfaz de usuario

No hay valor predeterminado para cancelar el hilo

No hay agrupación de hilos predeterminada

No hay valores predeterminados para manejar los cambios de configuración en Android

Tarun Varshney
fuente
3
En realidad, esto es más esclarecedor porque aborda las razones por las que no se deben usar hilos simples. Desde el principio de mi mente, cualquier cosa que deba estar vinculada al ciclo de vida de la Actividad / Servicio debería usar AsyncTask en su lugar, a pesar de que necesita "degradar con gracia" manualmente los recursos dentro de la tarea, al menos no termina con la tarea suspendida cuando se mata la actividad.
leRobot
28

Hilo

  • Tarea larga en general
  • Invocar por el método thread.start ()
  • Activado desde cualquier hilo
  • Se ejecuta en su propio hilo
  • La gestión / código manual de hilos puede ser difícil de leer

AsyncTask

  • Pequeña tarea tener que comunicarse con el hilo principal
  • Invocar por el método excute ()
  • Activado desde el hilo principal
  • Se ejecuta en el subproceso de trabajo
  • Debe ejecutarse y crearse desde el hilo principal
Umang Kothari
fuente
11

Hilo

Un hilo es una unidad concurrente de ejecución. Tiene su propia pila de llamadas. Hay dos métodos para implementar subprocesos en las aplicaciones.

Uno está proporcionando una nueva clase que extiende Thread y anula su método run (). El otro es proporcionar una nueva instancia de Thread con un objeto Runnable durante su creación. Un subproceso se puede ejecutar llamando a su método de "inicio". Puede establecer la "Prioridad" de un hilo llamando a su método "setPriority (int)".

Se puede usar un hilo si no tiene ningún efecto en la parte de la interfaz de usuario. Por ejemplo, está llamando a algún servicio web o descargando algunos datos, y después de la descarga, los está mostrando en su pantalla. Luego, debe usar un controlador con un subproceso y esto hará que su aplicación sea complicada para manejar todas las respuestas de los subprocesos.

Un controlador le permite enviar y procesar mensajes y objetos ejecutables asociados con MessageQueue de un hilo. Cada hilo tiene cada cola de mensajes. (Como una lista de tareas pendientes), y el hilo tomará cada mensaje y lo procesará hasta que la cola de mensajes esté vacía. Entonces, cuando el controlador se comunica, solo envía un mensaje al hilo del llamador y esperará a que se procese.

Si utiliza subprocesos Java, debe manejar los siguientes requisitos en su propio código:

Sincronización con el hilo principal si publica resultados en la interfaz de usuario No hay valor predeterminado para cancelar el hilo No hay agrupación de hilos predeterminada No hay valor predeterminado para manejar los cambios de configuración en Android

AsyncTask

AsyncTask permite el uso correcto y fácil del hilo de la interfaz de usuario. Esta clase permite realizar operaciones en segundo plano y publicar resultados en el subproceso de la interfaz de usuario sin tener que manipular subprocesos y / o controladores. Una tarea asincrónica se define mediante un cálculo que se ejecuta en un subproceso en segundo plano y cuyo resultado se publica en el subproceso de la interfaz de usuario.

AsyncTask pasará por las siguientes 4 etapas:

onPreExecute ()

Se invoca en el subproceso de la interfaz de usuario antes de ejecutar la tarea

doInbackground (Parámetros ..)

Se invoca en el subproceso de fondo inmediatamente después de que onPreExecute () termine de ejecutarse.

onProgressUpdate (Progreso ..)

Se invoca en el subproceso de la interfaz de usuario después de una llamada para publicar Progress (Progress ...).

onPostExecute (Resultado)

Se invoca en el subproceso de la interfaz de usuario después de que finaliza el cálculo en segundo plano.

¿Por qué deberías usar AsyncTask?

Fácil de usar para un subproceso de interfaz de usuario. (Por lo tanto, úselo cuando el hilo de la persona que llama es un hilo de la interfaz de usuario).

No es necesario manipular manipuladores.

Para más información visite aquí

Vipul Purohit
fuente
2

Hilo:

Threaddebe usarse para separar las operaciones de larga ejecución del hilo principal para mejorar el rendimiento. Pero no se puede cancelar con elegancia y no puede manejar los cambios de configuración de Android. No puede actualizar la interfaz de usuario desde Thread.

AsyncTaskse puede usar para manejar elementos de trabajo de menos de 5 ms de duración. Con AsyncTask, puede actualizar la interfaz de usuario a diferencia de Java Thread. Pero muchas tareas de larga duración ahogarán el rendimiento.

Tienes pocas alternativas más para ambos.

HandlerThread / Handler y ThreadPoolExecutor

Consulte la publicación a continuación para obtener más detalles:

Handler vs AsyncTask vs Thread

Ravindra babu
fuente