En algunos casos, es posible realizar la misma tarea con un AsyncTask
o con un, Service
sin embargo, generalmente uno se adapta mejor a una tarea que el otro.
AsyncTask
s están diseñados para tareas que requieren mucho tiempo y que no se pueden ejecutar desde el subproceso de la interfaz de usuario. Un ejemplo común es buscar / procesar datos cuando se presiona un botón.
Service
s están diseñados para ejecutarse continuamente en segundo plano. En el ejemplo anterior de recuperación de datos cuando se presiona un botón, puede iniciar un servicio, dejar que recupere los datos y luego detenerlo, pero esto es ineficiente. Es mucho más rápido usar uno AsyncTask
que se ejecutará una vez, devolverá los datos y listo.
Sin embargo, si necesita estar haciendo algo continuamente en segundo plano, un Service
es su mejor opción. Ejemplos de esto incluyen reproducir música, verificar continuamente nuevos datos, etc.
Además, como ya dijo Sherif, los servicios no se ejecutan necesariamente del hilo de la interfaz de usuario.
En su mayor parte, los Service
s son para cuando desea ejecutar código incluso cuando la aplicación Activity
no está abierta. AsyncTask
s están diseñados para hacer que la ejecución de código fuera del hilo de la interfaz de usuario sea increíblemente simple.
Los servicios son completamente diferentes: ¡los servicios no son hilos !
Su actividad se une a un servicio y el servicio contiene algunas funciones que, cuando se llama, bloquea el hilo de la llamada. Su servicio podría usarse para cambiar la temperatura de grados Celsius a grados. Cualquier actividad que se vincule puede obtener este servicio.
Sin embargo,
AsyncTask
es un subproceso que funciona en segundo plano y al mismo tiempo tiene la capacidad de informar los resultados al subproceso de llamada.Solo un pensamiento: ¡Un servicio puede tener un
AsyncTask
objeto!fuente
Service
es uno de los componentes del marco de Android, que no requiere que la UI se ejecute, lo que significa que incluso cuando la aplicación no es utilizada activamente por el usuario, puede realizar algunas operaciones con el servicio. Eso no significa que el servicio se ejecutará en un hilo separado, pero se ejecuta en el hilo principal y la operación se puede realizar en un hilo separado cuando sea necesario. Ejemplos de uso son reproducir música en segundo plano, sincronizar datos con el servidor en el fondo sin interacción del usuario, etc.AsyncTask
por otro lado, se usa para que las tareas de bloqueo de la IU se realicen en un subproceso separado. Es lo mismo que crear un nuevo subproceso y realizar la tarea cuando todas las tareas de crear y mantener los subprocesos y enviar el resultado al subproceso principal son atendidas por AsyncTask.fuente
El servicio y los asinctascos están casi haciendo lo mismo, casi el uso del servicio o un asinctask depende de cuál sea su requerimiento.
Como ejemplo, si desea cargar datos a una vista de lista desde un servidor después de presionar algún botón o cambiar la pantalla, mejor vaya con un asynctask. Se ejecuta en paralelo con el hilo principal de la interfaz de usuario (se ejecuta en segundo plano). Para ejecutar la actividad de asinctack o su aplicación en el hilo principal de la interfaz de usuario. después de salir de la aplicación no hay asynctask.
Pero los servicios no son así, una vez que inicias un servicio, puede ejecutarse después de salir de la aplicación, a menos que lo detengas, como dije, depende de tus requisitos, si quieres seguir comprobando la recepción de datos o el estado de la red. continuamente es mejor ir con el servicio.
feliz codificación
fuente
En algunos casos, puede lograr la misma funcionalidad con ambos. A diferencia de Async Task, el servicio tiene su propio ciclo de vida y hereda Context (el servicio es más robusto que una Async Task). El servicio puede ejecutarse incluso si ha salido de la aplicación. Si desea hacer algo incluso después del cierre de la aplicación y también necesita la variable de contexto, irá a Servicio.
Ejemplo: si desea reproducir una música y no desea hacer una pausa si el usuario abandona la aplicación, definitivamente irá al Servicio.
fuente
Comparación de un servicio local, en proceso, de clase base ✱ con un
AsyncTask
:✱ (Esta respuesta no aborda los servicios exportados, o cualquier servicio que se ejecute en un proceso diferente al del cliente, ya que los casos de uso esperados difieren sustancialmente de los de un
AsyncTask
. Además, en aras de la brevedad, la naturaleza de ciertos servicios especializadosService
las subclases (p. ej.IntentService
,JobService
) se ignorarán aquí).Proceso de por vida
A
Service
representa, para el sistema operativo, "el deseo de una aplicación de realizar una operación de ejecución más larga sin interactuar con el usuario" [ ref ].Mientras tiene una
Service
ejecución, Android comprende que no desea que se elimine su proceso. Esto también es cierto cuando tiene un enActivity
pantalla, y es especialmente cierto cuando ejecuta un servicio en primer plano . (Cuando todos los componentes de su aplicación desaparecen, Android piensa: "Oh, ahora es un buen momento para eliminar esta aplicación, así puedo liberar recursos").Además, dependiendo del último valor de retorno de
Service.onCreate()
, Android puede intentar "revivir" aplicaciones / servicios que fueron eliminados debido a la presión de recursos [ ref ].AsyncTasks
no hagas nada de eso. No importa cuántos subprocesos de fondo ejecute o qué tan duro estén trabajando: Android no mantendrá su aplicación activa solo porque su aplicación esté utilizando la CPU. Tiene que tener alguna forma de saber que su aplicación todavía tiene trabajo que hacer; es por eso queServices
están registrados con el sistema operativo yAsyncTasks
no lo están.Multithreading
AsyncTasks
se trata de crear un subproceso en segundo plano en el que hacer el trabajo y luego presentar el resultado de ese trabajo al subproceso de la interfaz de usuario de una manera segura.Cada nueva
AsyncTask
ejecución generalmente genera más concurrencia (más subprocesos), sujeto a las limitaciones del conjunto deAsyncTasks's
subprocesos [ ref ].Service
los métodos, por otro lado, siempre se invocan en el hilo de la interfaz de usuario [ ref ]. Esto se aplica aonCreate()
,onStartCommand()
,onDestroy()
,onServiceConnected()
, etc Por lo tanto, en cierto sentido,Services
no "correr" en el fondo. Una vez que comienzan (onCreate()
), simplemente se "sientan" allí, hasta que es hora de limpiar, ejecutar unonStartCommand()
, etc.En otras palabras, agregar más
Services
no resulta en más concurrencia. Los métodos de servicio no son un buen lugar para realizar grandes cantidades de trabajo, ya que se ejecutan en el hilo de la interfaz de usuario .Por supuesto, puede ampliar
Service
, agregar sus propios métodos y llamarlos desde cualquier hilo que desee. Pero si hace eso, la responsabilidad de la seguridad del hilo recae en usted, no en el marco.Si desea agregar un hilo de fondo (o algún otro tipo de trabajador) a su
Service
, puede hacerlo. Se podría iniciar un hilo de fondo /AsyncTask
enService.onCreate()
, por ejemplo. Pero no todos los casos de uso requieren esto. Por ejemplo:Service
ejecutándose para poder seguir recibiendo actualizaciones de ubicación en el "fondo" (es decir, sin necesariamente tener ninguna enActivities
pantalla).BroadcastReceiver
registro "implícito" a largo plazo (después de API 26, no siempre puede hacer esto a través del manifiesto, por lo que debe registrarse en tiempo de ejecución [ ref ]).Ninguno de estos casos de uso requiere una gran cantidad de actividad de la CPU; solo requieren que la aplicación no sea eliminada .
Como trabajadores
Services
no están orientados a tareas. No están configurados para "realizar una tarea" y "entregar un resultado", comoAsyncTasks
son.Services
no resuelva ningún problema de seguridad de subprocesos (a pesar del hecho de que todos los métodos se ejecutan en un solo subproceso).AsyncTasks
, por otro lado, maneja esa complejidad por ti.Tenga en cuenta que
AsyncTask
está programado para desuso . ¡Pero eso no significa que deba reemplazarloAsyncTasks
porServices
! (Si ha aprendido algo de esta respuesta, eso debería quedar claro).TL; DR
Services
están principalmente allí para "existir". Son como fuera de la pantallaActivity
, lo que proporciona una razón para que la aplicación se mantenga viva, mientras que otros componentes se encargan de hacer el "trabajo".AsyncTasks
"trabajan", pero no mantendrán vivo un proceso en sí mismos.fuente