java - programacion - hilos asynctask android
¿Cuándo usar un servicio o AsyncTask o Handler? (5)
Servicio
Un servicio es un componente de aplicación que puede realizar operaciones de larga ejecución en segundo plano y no proporciona una interfaz de usuario. Otro componente de la aplicación puede iniciar un servicio y continuará ejecutándose en segundo plano, incluso si el usuario cambia a otra aplicación. Además, un componente puede vincularse a un servicio para interactuar.
¿Cuándo usar?
Tarea sin interfaz de usuario, pero no debería ser demasiado larga. Use hilos dentro del servicio para tareas largas. Larga tarea en general.
Desencadenador: llamada al método onStartService ()
Desencadenado desde: cualquier subproceso
Se ejecuta: hilo principal de su proceso de alojamiento. El servicio no crea su propio hilo y no se ejecuta en un proceso separado (a menos que especifique lo contrario)
Limitaciones / Inconvenientes: puede bloquear el hilo principal
AsyncTask
AsyncTask permite el uso adecuado y fácil de la cadena de interfaz de usuario. Esta clase permite realizar operaciones en segundo plano y publicar resultados en el subproceso de UI sin tener que manipular subprocesos y / o controladores. Una tarea asíncrona 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.
¿Cuándo usar?
Pequeña tarea que tiene que comunicarse con el hilo principal Para las tareas en paralelo, use múltiples instancias O tareas ejecutables del disco Executor que pueden tomar más de unos pocos milisegundos
Disparador: llamada al método execute ()
Activado desde: Tema principal
Se ejecuta: hilo de trabajo. Sin embargo, los métodos del hilo principal pueden invocarse entre ellos para publicar el progreso.
Limitaciones / Inconvenientes:
- Una instancia solo se puede ejecutar una vez (por lo tanto, no se puede ejecutar en un bucle)
- Debe ser creado y ejecutado desde el hilo principal
Ref Link
¿Puede alguien decirme la VERDADERA diferencia?
Para complementar las otras respuestas aquí con respecto a la distinción entre servicio y AsyncTask, también vale la pena señalar [0]:
- Un servicio no es un proceso separado. El objeto de servicio en sí no implica que se esté ejecutando en su propio proceso; a menos que se especifique lo contrario, se ejecuta en el mismo proceso que la aplicación de la que forma parte.
- Un servicio no es un hilo. No es un medio para hacer el trabajo fuera del hilo principal (para evitar errores de la aplicación no responde).
Los servicios tienden a ser elementos que describen una parte importante de su aplicación, en lugar de una AsyncTask que, por lo general, contribuye a una Actividad y / o mejora la capacidad de respuesta de la IU. Además de mejorar la claridad del código, los servicios también se pueden compartir con otras aplicaciones, proporcionando interfaces claras entre su aplicación y el mundo exterior.
En lugar de un libro, diría que la guía para desarrolladores tiene muchas buenas respuestas.
[0] Fuente: http://developer.android.com/reference/android/app/Service.html#WhatIsAService
Use el servicio cuando tenga algo que deba ejecutarse en segundo plano durante períodos de tiempo prolongados. No está ligado a ninguna actividad. El ejemplo canónico es un reproductor de música.
AsyncTask es genial cuando hay que hacer algunas cosas en segundo plano mientras se está en la actividad actual. Por ejemplo, descargar, buscar texto dentro de un archivo, etc.
Personalmente uso Handlers solo para publicar cambios en el hilo de UI. Por ejemplo, puedes hacer algunos cálculos en un hilo de fondo y publicar el resultado a través del controlador.
La conclusión: en la mayoría de los casos, AsyncTask es lo que necesita.
Mi regla empírica es que una AsyncTask
es para cuando quiero hacer algo relacionado con una sola Activity
y un Service
para cuando quiero hacer algo que continuará después de que la actividad que comenzó esté en segundo plano.
Entonces, si quiero hacer un poco de procesamiento de fondo en la Activity
sin AsyncTask
la UI, AsyncTask
una AsyncTask
. A continuación, utilizaré el Handler
predeterminado de esa Activity
para pasar mensajes de vuelta para asegurar que las actualizaciones sucedan en el hilo principal. El procesamiento de las actualizaciones en el hilo principal tiene dos ventajas: las actualizaciones de la interfaz de usuario se realizan correctamente y no tiene que preocuparse demasiado por los problemas de sincronización.
Si, por ejemplo, quisiera hacer una descarga que podría demorar un tiempo, utilizaría un Service
. Por lo tanto, si fuera a otra Activity
en mi aplicación u otra aplicación, mi Service
podría seguir funcionando y seguir descargando el archivo para que esté listo cuando regrese a mi aplicación. En este caso, probablemente usaré una Notificación de la barra de estado una vez que se haya completado la descarga, para que el usuario pueda optar por regresar a mi aplicación siempre que sea conveniente para ellos.
Lo que encontrará si utiliza una AsyncTask
para un proceso de larga ejecución puede continuar después de que haya navegado fuera de la Activity
pero:
- Si la
Activity
está en segundo plano cuando se completa su procesamiento, puede tener problemas cuando intente actualizar la interfaz de usuario con los resultados, etc. - Una
Activity
fondo es mucho más probable que Android muera cuando necesita memoria que unService
.
- AsyncTask: cuando deseo hacer algo sin colgar la IU y reflejar los cambios en la IU.
Por ejemplo: descargar algo con un clic de botón, permanecer en la misma actividad y mostrar la barra de progreso / barra de búsqueda para actualizar el porcentaje descargado. Si la actividad entra en segundo plano, hay posibilidades de conflicto.
- Servicio: cuando deseo hacer algo en segundo plano que no necesite actualizar la UI, use un Servicio. No importa si la Aplicación está en primer plano o en segundo plano.
Por ejemplo: cuando una aplicación descargada de Android Market muestra una notificación en la barra de estado, la interfaz de usuario vuelve a la página anterior y le permite hacer otras cosas.