¿Debo usar AsyncTask o IntentService para mi aplicación?


He estado leyendo en torno a la conectividad a Internet con Android y se dio cuenta de que hay diferentes maneras de manejar esto es decir.AsyncTask y IntentService. Sin embargo, todavía no estoy seguro de cuál usar. Mi aplicación es básicamente un buscador de ubicación / senderos con Google Maps. Mi conexión a Internet se utilizará para encontrar los senderos más cercanos dentro de un cierto radio del mapa. Por lo tanto, cada vez que un usuario se mueve o desliza el mapa a una nueva ubicación, se actualizará con los senderos más cercanos. Se también agregará un nuevo sendero y permitirá al usuario calificar un sendero.

Será AsyncTask suficiente para esto o debo usar IntentService?

Author: naXa, 2013-03-02

7 answers

Debes usar un AsyncTask para tareas cortas repetitivas que están estrechamente vinculadas a una actividad, como lo que estás tratando de hacer actualmente. IntentService están más orientados a tareas programadas (repetitivas o no) que deben ejecutarse en segundo plano, independientemente de su actividad.

 47
Author: ebarrenechea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-01 21:33:14

Se pueden usar de manera muy diferente para diferentes propósitos.

AsyncTask es una útil utilidad de subproceso que se puede usar si necesita decirle algo constantemente al usuario o realizar operaciones periódicamente en el subproceso principal. Ofrece mucho control de grano fino, y debido a su naturaleza es muy fácil trabajar con Activity mientras que un IntentService generalmente requiere usar el marco BroadcastReceiver o IBinder.

IntentService se puede usar muy parecido a un AsyncTask, pero su propósito está destinado a descarga en segundo plano, carga u otras operaciones de bloqueo que no necesitan la interacción del usuario o el hilo principal. Por ejemplo, si desea descargar y almacenar mapas en caché, es posible que desee llamar a un IntentService para que el usuario no tenga que estar mirando la aplicación para que se descargue. Del mismo modo, si está enviando datos a su servidor, un IntentService es extremadamente útil en este sentido porque puede comenzar y olvidar. El usuario puede, por ejemplo, escribir un comentario en su aplicación y luego presionar "enviar". "Enviar" lanzará el IntentService que obtiene el comentario y lo envía a su servidor en un hilo en segundo plano. El usuario podría presionar "enviar" y abandonar la aplicación inmediatamente y el comentario, eventualmente, aún llegará a sus servidores (suponiendo que no haya errores, por supuesto). Si usted hizo esto con un AsyncTask en su Activity por otro lado, el sistema podría matar a su proceso en el medio de su intercambio y puede-o-puede no pasar.

En términos generales, ninguno de los dos está destinado a aplicaciones de larga ejecución. Son para abreviar, operaciones únicas. Podrían usarse para acciones permanentes o de larga duración, pero no se recomienda.

 54
Author: DeeV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-24 16:57:19

AsyncTask no funciona bien con cambios de configuración u otras cosas que reinician la Actividad.

IntentService es bueno para algo que siempre debe estar disponible, independientemente del tiempo que tarde en hacer su trabajo. Prefiero IntentService en la mayoría de los casos porque AsyncTask es mucho más dependiente del estado de la actividad.

Algunas notas:

  • AsyncTask es mejor para tareas rápidas que deberían regresar directamente a la interfaz de usuario, pero se puede usar en una variedad de situación.
  • La instrucción "realizar periódicamente operaciones en el hilo principal" es vaga. AsyncTask genera un nuevo hilo de fondo que es diferente de el hilo principal, y hace su trabajo en el nuevo hilo. Así el nombre AsyncTask.
  • Un IntentService no requiere "manipular" el framework BroadcastReceiver. Todo lo que necesitas hacer es enviar una Intent de difusión local y detectarla en tu actividad. Si esto es más difícil de hacer que una AsyncTask, yo no saber.
  • IntentService es destinado a realizar tareas de larga duración, lo que hace en segundo plano.
  • Se puede usar AsyncTaskLoader, pero está destinado a ser la clase base para CursorLoader, etc. Si desea actualizar las rutas "cercanas" cuando los usuarios se mueven a una nueva ubicación, un IntentService es probablemente mejor.

No olvide comprobar la conectividad antes de intentar actualizar la ubicación.

 21
Author: Joe Malin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-01 23:29:45

Las AsyncTasks están muy estrechamente vinculadas a Activitys y a menudo pueden causar errores de ventana filtrada si se aleja de la Actividad que creó la AsyncTask. Pero son excelentes para mostrar una barra de progreso porque puede actualizar rápidamente el porcentaje de progreso.

Los IntentServices son más limpios y seguros. Son más difíciles de implementar cuando eres un desarrollador de Android principiante, pero una vez que aprendas cómo iniciarlos y manejarlos, probablemente nunca vuelvas a AsyncTasks!

IntentServices también permiten un diseño más modular en su aplicación. Normalmente creo una clase separada para todos mis IntentServices, pero para AsyncTasks los creo como una clase interna de Actividad. Si tuviera que separar un AsyncTask de una Actividad, tendría que pasar en el Contexto de Actividad y Ver objetos en el constructor AsyncTask que puede ser desordenado.

 8
Author: Lou Morda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-22 16:44:18

Como se mencionó anteriormente AsyncTask resolverá su problema.

Pero ten en cuenta que AsyncTask tiene una debilidad importante: no se maneja bien Activity "refrescar" (por ejemplo, durante la rotación). Puede ser un problema si, por ejemplo, el usuario gira el teléfono mientras su AsyncTask todavía está cargando cosas. Si esto es realmente un problema para usted recomiendo AsyncTaskLoader:

Http://developer.android.com/reference/android/content/AsyncTaskLoader.html

 6
Author: ivan.aguirre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-01 22:16:11

AsyncTask y IntentService tienen muchos mismos

  • Puede ejecutar la tarea en worker thread
  • Puede ejecutarse en segundo plano
  • Sigue corriendo hasta que termine la tarea evento la actividad que la inició se destruye
  • No se puede notificar para actualizar la interfaz de usuario durante la ejecución de la tarea o después de finalizar la tarea
    • Para AsyncTask a menudo usamos onProgressUpdate, onPostExecute o si quieres puedes usar BroadcastReceiver
    • Para IntentService usamos BroadcastReceiver

Diferente

1) Enviar tarea mientras correr o después de correr terminar

Ejemplo tenemos una tarea es: descargar archivo desde la base del servidor en fileName.

Usando AsyncTask

Si tenemos una instancia de AsyncTask, durante la ejecución del archivo de descarga A no podemos ejecutar el archivo de descarga B AsyncTask (ya que obtenemos java.lang.IllegalStateException: Cannot execute task: the task is already running.). También después de descargar el archivo A terminado, no podemos ejecutar la descarga del archivo B (ya que obtenemos java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once).
Para descargar el archivo B durante o después de descargar el archivo A, necesitamos crear un nuevo instancia de AsyncTask.
=> Para descargar el archivo A y el archivo B, necesitamos 2 instancias de AsyncTask = > 2 worker thread creado

Usando IntentService

Durante la descarga del archivo A, podemos enviar la intención de descargar el archivo B => después de descargar el archivo A finalizado, se iniciará automáticamente la descarga del archivo B => no necesita una nueva instancia, no necesita un nuevo hilo de trabajo.

Si enviamos la intención de descargar el archivo B después de descargar el archivo A finalizado? Después de descargar un archivo terminado, IntentSevice será destruido (porque no hay más tarea). Por lo tanto, cuando se inicia la descarga del archivo B, se crea una nueva instancia de Service sin embargo, no se crea un nuevo hilo (el servicio sigue usando solo 1 hilo de trabajo cuyo nombre está definido en IntentSevice constructor

2) Implementar AsyncTask es más fácil que IntentService

USANDO
Veremos que AsyncTask y IntentService tienen muchos iguales, por lo que en la mayoría de los casos podemos usar AsyncTask o IntentService. Sin embargo

  • A menudo uso AsyncTask para algunos tarea que inicia, finaliza, interactúa con la interfaz de usuario en 1 Activity
  • A menudo uso IntentService para alguna tarea que puede comenzar/terminar e interactuar o no interactuar con la interfaz de usuario desde cualquier Activity

Esta respuesta se basa en mi prueba. Por favor corrígeme si me equivoco. Espero que ayude.

 2
Author: Phan Van Linh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-31 08:39:21

Estoy de acuerdo con @DeeV y @ebarrenechea sobre el servicio Intent en parte que debe usarlo para tareas que no están estrechamente vinculadas con la Actividad como cargar algunos datos al servidor o almacenar datos del servidor a la base de datos.

Pero a partir de Android 3.0 se introdujeron Loaders API Que debería reemplazar a AsyncTask. Así, por ejemplo para la lista de carga que debe mostrar en la actividad es mejor utilizar Cargador que está diseñado para manejar bien todos los cambios de configuración y Ciclo de vida de la actividad.

Vogella loader tutorial

 -1
Author: Lemberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-22 15:03:17