Android: AsyncTask vs Servicio

138

¿Por qué leo mucho en la respuesta a la mayoría de las preguntas sobre AsyncTaskCargadores y nada sobre Servicios? ? ¿Los servicios simplemente no se conocen muy bien o están en desuso o tienen algunos atributos malos o algo? ¿Cuáles son las diferencias?

(Por cierto, sé que hay otros hilos al respecto, pero ninguno realmente establece diferencias claras que ayuden a un desarrollador a decidir fácilmente si es mejor usar uno u otro para un problema real).

erikbwork
fuente

Respuestas:

272

En algunos casos, es posible realizar la misma tarea con un AsyncTasko con un, Servicesin embargo, generalmente uno se adapta mejor a una tarea que el otro.

AsyncTasks 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.

Services 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 AsyncTaskque 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 Services son para cuando desea ejecutar código incluso cuando la aplicación Activityno está abierta. AsyncTasks 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.

Computarizado
fuente
2
Es interesante que en esta charla de Google I / O en 2010 youtube.com/watch?v=xHXn3Kg2IQE el presentador ofrezca 3 métodos diferentes para obtener datos de una API REST y el primero utiliza un servicio. No soy un experto en Android, pero también tenía la impresión de que lo que Computerish dijo es básicamente correcto.
wuliwong
10
El último párrafo, "Los servicios son para cuando desea ejecutar código incluso cuando la Actividad de su aplicación no está abierta". Este también es el caso con AsyncTask o subprocesos en segundo plano. es decir, cuando presiona hacia atrás en su actividad o finaliza la llamada () y su actividad no es visible, pero sus subprocesos en segundo plano se ejecutan hasta que finaliza el proceso de su aplicación (por ejemplo, al cambiar de tareas recientes). He comprobado esto con 4.4.2 mero de Google Nexus AOSP
Shirish Herwade
10
Sin embargo, AsyncTask puede ser complicado si la actividad que la inició se elimina mientras AsyncTask aún se está ejecutando y necesita actualizar la interfaz de usuario una vez que está hecha ... (lo que no funcionará ya que la actividad ya está destruida). ¿Por qué no utilizar un IntentService que afaik no necesita detener manualmente, ya que simplemente termina una vez hecho?
AgentKnopf
Grandes puntos. Buena explicación sobre el servicio. Es decir, el servicio se ejecuta en segundo plano continuamente, incluso el trabajo está hecho.
BABU K
3
@LarsH Corrígeme si estoy equivocado, pero creo que podrías usar un BroadcastReceiver en tu Activity / Fragment y desde IntentService simplemente disparas una Broadcast una vez que hayas terminado. Dado que puede volver a registrarse para las transmisiones tras la recreación de Actividad / Fragmento que debería tener cubierto. Otra alternativa sería usar un EventBus para actualizar la interfaz de usuario (aunque trato de evitarlos, hace que el código sea más difícil de seguir).
AgentKnopf
58

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, AsyncTaskes 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 AsyncTaskobjeto!

Sherif elKhatib
fuente
2
Sin embargo, se describe que los servicios se ejecutan en segundo plano y continúan incluso cuando su aplicación está cerrada. AsyncTask también se usa para hacer algo en segundo plano. ¿Ya tu sabes?
erikbwork
1
Sí, pero los servicios pueden o no estar haciendo algo. Son un OBJETO duradero
Sherif elKhatib
"¡Un servicio puede tener un objeto AsyncTask!" Gracias por señalar eso. Pero, ¿es una buena idea? ¿Es algo que recomendarías? ¿O sería mejor usar técnicas de subprocesamiento más básicas en un servicio?
RenniePet
"Su actividad se une a un servicio" no necesariamente.
JacksOnF1re
@ JacksOnF1re Sé que esto es como cuando comencé a codificar: p pero "Su actividad se une a un servicio" es una declaración verdadera. También podría ser vinculante para este servicio. Un refrigerador también podría ser vinculante. Esto no invalida la declaración ... de todos modos jk
Sherif elKhatib
7

Servicees 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.

AsyncTaskpor 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.

arjun
fuente
¿Puedes especificar por qué crees que tu respuesta agrega algo a la pregunta?
erikbwork
2
otras respuestas son demasiado cortas o demasiado largas para que los principiantes las entiendan. así que respondí precisamente en palabras simples con ejemplos
arjun
6

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

Ashana.Jackol
fuente
1
Hola Ashana, ¿puedo preguntarte por qué proporcionaste esta respuesta a una pregunta que ya está respondida? ¿No está satisfecho con la respuesta marcada existente? ¿O intenta crear un perfil SO escribiendo su opinión sobre todas las preguntas sobre las que tiene algo que decir? ¿O algo completamente diferente? No puedo entenderlo, pero veo ese patrón muy a menudo últimamente.
erikbwork
3
ya sé que la respuesta ya está dada y no veo mucho problema aquí si doy la respuesta correcta o mi opinión aquí hermano? porque usted no es el único que busca la respuesta a la misma pregunta, si alguien difícil de entender la solución en las respuestas anteriores puede desplazarse hacia abajo para buscar una respuesta que se ajuste bien a ellos, entiéndala fácilmente. Eso es todo. Gracias por el comentario hermano, no soy un genio o un profesional en programación, solo quiero ayudar a otros, tratar de enseñar a otros lo que ya sé :)
Ashana.Jackol
1

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.

sayem siam
fuente
1

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 especializados Servicelas subclases (p. ej. IntentService, JobService) se ignorarán aquí).

Proceso de por vida

A Servicerepresenta, 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 Serviceejecución, Android comprende que no desea que se elimine su proceso. Esto también es cierto cuando tiene un en Activitypantalla, 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 ].

AsyncTasksno 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 que Servicesestán registrados con el sistema operativo y AsyncTasksno 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 AsyncTaskejecución generalmente genera más concurrencia (más subprocesos), sujeto a las limitaciones del conjunto de AsyncTasks'ssubprocesos [ ref ].

Servicelos métodos, por otro lado, siempre se invocan en el hilo de la interfaz de usuario [ ref ]. Esto se aplica a onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), etc Por lo tanto, en cierto sentido, Servicesno "correr" en el fondo. Una vez que comienzan ( onCreate()), simplemente se "sientan" allí, hasta que es hora de limpiar, ejecutar un onStartCommand(), etc.

En otras palabras, agregar más Servicesno 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 / AsyncTasken Service.onCreate(), por ejemplo. Pero no todos los casos de uso requieren esto. Por ejemplo:

  • Es posible que desee seguir Serviceejecutándose para poder seguir recibiendo actualizaciones de ubicación en el "fondo" (es decir, sin necesariamente tener ninguna en Activitiespantalla).
  • O bien, es posible que desee mantener viva su aplicación para que pueda mantener un BroadcastReceiverregistro "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

Servicesno están orientados a tareas. No están configurados para "realizar una tarea" y "entregar un resultado", como AsyncTasksson. Servicesno 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 AsyncTaskestá programado para desuso . ¡Pero eso no significa que deba reemplazarlo AsyncTaskspor Services! (Si ha aprendido algo de esta respuesta, eso debería quedar claro).

TL; DR

Servicesestán principalmente allí para "existir". Son como fuera de la pantalla Activity, 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.

greeble31
fuente