¿Diferencia entre servicio, tarea asincrónica e hilo?

147

¿Cuál es la diferencia entre Service, Async Task & Thread? Si no me equivoco, todos ellos se utilizan para hacer algunas cosas en segundo plano. Entonces, ¿cómo decidir cuál usar y cuándo?

SpunkerBaba
fuente
Parece que hay una cosa más con la que las personas pueden confundirse a menudo: los cargadores . Tema
RBT

Respuestas:

186

Probablemente ya haya leído la descripción de la documentación sobre ellos, no los repetiré, en su lugar, trataré de responder con mis propias palabras, espero que lo ayuden.

  • El servicio es como una actividad pero no tiene interfaz de usuario. Probablemente, si desea obtener el clima, por ejemplo, no creará una actividad en blanco para ello, para esto utilizará un Servicio.

  • Un hilo es un hilo, probablemente ya lo sabes de otra parte. Debe saber que no puede actualizar la interfaz de usuario desde un subproceso. Necesitas usar un controlador para esto, pero sigue leyendo.

  • Un AsyncTask es un subproceso inteligente que se recomienda utilizar. Inteligente, ya que puede ayudar con sus métodos, y hay tres métodos que se ejecutan en el subproceso de la interfaz de usuario, lo cual es bueno para actualizar los componentes de la interfaz de usuario.

Estoy usando Servicios, AsyncTasks con frecuencia. Hilo menos, o nada en absoluto, ya que puedo hacer casi todo con AsyncTask.

Pentium10
fuente
1
Gracias por tu explicación. Entonces, si necesito crear una aplicación que obtenga datos de la web, ¿cuál sería una mejor opción de servicio o tarea asincrónica?
SpunkerBaba
16
Necesitas usar ambos. Crea un Servicio y dentro de eso usa AsyncTask.
Pentium10
44
Agregue a la respuesta anterior, AsyncTask pasa por 4 pasos onPreExecute (), onProgressUpdate (Progress ...) onPostExecute (Result), {ejecutándose en el subproceso de la interfaz de usuario}, doInBackground (Parámetros ...) {ejecutándose en el subproceso de fondo}. Dado que proporciona 3 métodos en el subproceso de la interfaz de usuario, el usuario no necesita preocuparse por el uso de controladores o devoluciones de llamada para actualizar la interfaz de usuario.
SpunkerBaba
11
@ Pentium10: en lugar de Service + AsyncTask, a menudo puede usar un IntentService
njzk2
11
También es notable que, por defecto, los servicios de Android se ejecutan en el hilo principal (UI). Si su servicio necesita trabajar en segundo plano, debe iniciarse en un hilo separado (o AsyncTask) explícitamente. De lo contrario, puede correr el riesgo de interrumpir la capacidad de respuesta de la interfaz de usuario y generar errores de aplicación que no responde. Un servicio wrt Android es esencialmente una actividad 'invisible' y 'en miniatura', NO necesariamente un trabajador 'en segundo plano'.
CCJ
23

Esta es la respuesta más fácil para su pregunta.

Hilo

es una unidad de ejecución que se ejecuta "en paralelo" al subproceso principal, es un punto importante, no puede actualizar un componente de la interfaz de usuario de ningún subproceso aquí excepto el subproceso principal.

AsyncTask

es un subproceso especial, que le brinda métodos auxiliares para actualizar la interfaz de usuario, por lo que básicamente puede actualizar la interfaz de usuario, incluso AsyncTask se ejecutará en un subproceso en segundo plano. No se requiere que el manejo de la comunicación entre procesos se realice explícitamente.

Servicio

resuelva el problema anterior porque vive separado de la actividad que lo invoca para que pueda continuar ejecutándose incluso cuando la actividad se destruye, se ejecuta en el subproceso principal (tenga cuidado con ANR) use un servicio en segundo plano (extienda IntentService, crea el subproceso de trabajo automáticamente para usted) . El servicio es como una actividad sin interfaz de usuario , es bueno para tareas largas

Alejandro Serret
fuente
44
AyncTask no se volvería a crear al rotar el dispositivo porque no está sincronizado con los métodos del ciclo de vida de la Actividad.
CopsOnRoad
44
crea AsyncTask en un enlace de ciclo de vida de Actividad y cuando gira el teléfono, la Actividad se destruye y se reinicia. La instancia anterior de AsyncTask está conectada a esa Actividad que acaba de destruir y por esa razón obtendrá un "Cierre de fuerza", pero también verá cómo una nueva instancia de AsynTask se activa nuevamente. Puede usar Fragmentos para retener AsyncTask y establecer setRetainInstance (true) en el Fragmento que lo ayudará.
Alejandro Serret
15

Poca información más quisiera que alguien me hubiera contado hace unos días

  • Puede compartir variables globales, como subprocesos, entre Actividades y Servicios.
  • Su aplicación junto con todas sus variables globales no se eliminará mientras haya una Actividad o un Servicio todavía presente.
  • Si tiene una instancia de un Servicio en su aplicación y el SO necesita recursos, primero mata sus Actividades, pero mientras exista el Servicio, el SO no eliminará su aplicación junto con sus variables globales.

Mi caso de uso es así: tengo un hilo en el espacio global que está conectado a un servidor y una actividad que muestra los resultados. Cuando el usuario presiona el botón de inicio, la Actividad pasa a segundo plano y se inicia un nuevo Servicio. Este servicio lee los resultados del hilo y muestra información en el área de notificación cuando es necesario. No me preocupa que el SO destruya mi Actividad porque sé que mientras el Servicio se esté ejecutando, no destruirá el hilo.

Peter Jankuliak
fuente
9

En resumen, Service for time consuming tasks, AsyncTask for short-lived tasks, Thread es standard java constructionpara subprocesos.

Abath
fuente
3

Desde la perspectiva del desarrollador:

Subproceso : se utiliza para ejecutar el conjunto de códigos en paralelo al subproceso principal. Pero no puede manejar la interfaz de usuario dentro del hilo. Para eso necesitas usar Handler. Hadler funciona como hilo pero también puede manejar la interfaz de usuario.

ASyncTask : se utiliza para manejar las tareas que no puede hacer para trabajar en el hilo principal. Por ejemplo, una solicitud HTTP es un trabajo muy pesado que no se puede manejar en el subproceso principal, por lo que maneja la solicitud HTTP en el ASyncTasktrabajo en paralelo con su subproceso principal de forma asincrónica en segundo plano. eventos.

Servicio : es un proceso en segundo plano. Se emplea cuando tiene que hacer un procesamiento que no tiene ninguna interfaz de usuario asociada.

Rahul Raina
fuente
1
Serviceno necesariamente se ejecutará en segundo plano a menos que lo use IntentService. Si inició un estándar Servicedesde el UiThread, se ejecutará en el UiThread.
yshahak
@yshahak Tienes razón, pero aquí no necesitamos una definición profunda. El usuario solo quiere saber la diferencia entre ellos.
Rahul Raina
Sí, pero esto no es preciso, ya Serviceque no se ejecutará en un proceso diferente de forma predeterminada, sino en el proceso de la aplicación con los otros componentes. Es mejor decir que Servicese ejecutará en el fondo del hilo que vive dentro.
yshahak
Los tres anteriores funcionan dentro del proceso de solicitud. Los métodos preExecute () y postExecute () de ASyncTask funcionan en UIThread y doInBackground () y onProgress () funcionan en el subproceso de fondo. El servicio funciona en el subproceso de fondo y el subproceso también funciona en el subproceso de fondo. Sin embargo, Handler funciona en UI Thread.
Rahul Raina
2

el servicio es como una tarea que requiere mucho tiempo, pero la tarea Async nos permite realizar operaciones largas / en segundo plano y mostrar su resultado en el hilo de la interfaz de usuario sin tener que manipularlos.

pankaj
fuente