thread studio servicio segundo saber plano funciona example esta ejemplo crear corriendo como asynctask aplicacion android google-maps android-asynctask intentservice

android - studio - intentservice vs service



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

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

IntentService es bueno para algo que siempre debería estar disponible, independientemente de cuánto tiempo lleve hacer su trabajo. Prefiero IntentService en la mayoría de los casos porque AsyncTask depende mucho más del estado de la Actividad.

Algunas notas:

  • AsyncTask es mejor para tareas rápidas que deberían ir directamente a la interfaz de usuario, pero se puede usar en una variedad de situaciones.
  • La frase "realizar periódicamente operaciones en el hilo principal" es vaga. AsyncTask genera un nuevo hilo de fondo que es diferente del hilo principal y funciona en el nuevo hilo. Por lo tanto, el nombre AsyncTask.
  • Un IntentService no requiere "manipular" el marco de BroadcastReceiver. Todo lo que necesita hacer es enviar un intento de difusión local y detectarlo en su Actividad. Si esto es más difícil de hacer que una AsyncTask, no lo sé.
  • IntentService está destinado a realizar tareas de larga ejecución, lo que hace en segundo plano.
  • AsyncTaskLoader está bien para usar, pero está destinado a ser la clase base para CursorLoader, etc. Si desea actualizar rutas "cercanas" cuando los usuarios se trasladan a una nueva ubicación, un servicio de intención es probablemente mejor.

No olvide verificar la conectividad antes de tratar de actualizar la ubicación.

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

¿Bastará con AsyncTask para esto o debería usar IntentService?


AsyncTasks están estrechamente vinculados a las actividades y, a menudo, pueden provocar errores de ventanas filtrados si te alejas de la actividad que creó AsyncTask. Pero son excelentes para mostrar ProgressBar porque puede actualizar rápidamente el porcentaje de progreso.

IntentServices es más limpio y seguro. Son más difíciles de implementar cuando eres un desarrollador principiante de Android, pero una vez que aprendes cómo iniciarlos y manejarlos, ¡probablemente nunca volverás a AsyncTasks!

IntentServices también permite 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 una AsyncTask de una Actividad, tendría que pasar el Contexto de Actividad y los objetos de Vista en el constructor AsyncTask, lo que puede ser complicado.


Como se mencionó anteriormente, AsyncTask resolverá su problema.

Pero AsyncTask en cuenta que AsyncTask tiene una debilidad importante: no se maneja bien Activity "actualizar" (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 ti, recomiendo AsyncTaskLoader :

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


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

Pero a partir de Android 3.0 se introdujeron los cargadores API que deberían reemplazar a AsyncTask. Entonces, por ejemplo, para cargar la lista que debe mostrar en la Actividad, es mejor usar el cargador, que está diseñado para manejar bien todos los cambios de configuración y el ciclo de vida de la actividad.

Vogella loader tutorial


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

AsyncTask es una práctica utilidad de subprocesamiento que se puede usar si necesita contar constantemente al usuario algo o realizar operaciones periódicamente en el hilo principal. Ofrece una gran cantidad de control de grano fino, y debido a su naturaleza es muy fácil trabajar con la Activity mientras que un Servicio de IntentService generalmente requiere el uso del marco de BroadcastReceiver o IBinder .

IntentService se puede usar como una AsyncTask , pero su propósito es descargar, cargar u otras operaciones de bloqueo en segundo plano que no necesitan la interacción del usuario o el hilo principal. Por ejemplo, si desea descargar y IntentService caché los mapas, puede llamar a un servicio de 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 olvidarse. El usuario puede, por ejemplo, escribir un comentario en su aplicación y luego presionar "enviar". "Enviar" lanzará IntentService que recibe el comentario y lo envía a su servidor en una IntentService fondo. El usuario puede presionar "enviar" y abandonar la aplicación de inmediato y, eventualmente, el comentario llegará a sus servidores (suponiendo que no haya errores, por supuesto). Si AsyncTask esto con una AsyncTask en tu Activity , el sistema podría matar tu proceso en el medio de tu intercambio y puede que no funcione.

En general, ninguno de los dos está pensado para aplicaciones de larga ejecución. Están diseñados para operaciones cortas y puntuales. Se pueden usar para acciones permanentes o de larga duración, pero no se recomienda.


AsyncTask e IntentService tienen muchos mismos

  • Puede ejecutar la tarea en el hilo de trabajo
  • Puede correr en segundo plano
  • Sigue corriendo hasta que la tarea haya terminado. Se destruye la actividad que comenzó.
  • No se puede notificar para actualizar la IU durante la ejecución de una tarea o después de finalizar la tarea
    • Para AsyncTask menudo usamos onProgressUpdate , onPostExecute o si lo deseas puedes usar BroadcastReceiver
    • Para IntentService usamos BroadcastReceiver

Diferente

1) Enviar tarea mientras se ejecuta o después de ejecutar finalizar

El ejemplo que 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 de la descarga del archivo A no podemos ejecutar el archivo de descarga B AsyncTask (ya que obtenemos java.lang.IllegalStateException: Cannot execute task: the task is already running. ). Además, después de descargar el archivo A, no podemos ejecutar el archivo de descarga 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 una nueva instancia de AsyncTask .
=> Para descargar el archivo A y el archivo B, necesitamos 2 instancias de AsyncTask => 2 subprocesos de trabajo creados

Usando IntentService

Durante el archivo de descarga A, podemos enviar el intento de descargar el archivo B => después de descargar el archivo A terminado, comenzará automáticamente a descargar el archivo B => no necesita 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? Después de descargar el archivo A, IntentSevice se destruirá (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 se define en el constructor de IntentSevice

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

UTILIZANDO
Veremos que AsyncTask e IntentService tienen muchas IntentService por lo que en la mayoría de los casos podemos usar AsyncTask o IntentService . sin embargo

  • A menudo uso AsyncTask para algunas tareas que comienzan, terminan e interactúan con la interfaz de usuario en 1 Activity
  • A menudo uso IntentService para alguna tarea que puede iniciar / finalizar e interactuar o no interactuar con la interfaz de usuario desde cualquier Activity

Esta respuesta se basa en mi prueba. Por favor, corríjame si estoy equivocado. Espero que ayude


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