Android: uso de la red en un servicio

Hacer una llamada a un REST WebService en una clase de servicio de mi aplicación de Android crea la NetworkOnMainThreadException .

Entiendo por qué esta excepción se plantea en una actividad: buscar algo en la red de forma síncrona es una práctica extremadamente mala, pero me sorprende ver que el mismo error en una clase de servicio. Así que mi pregunta es:

-En este caso específico, debo utilizar StrictMode.setThreadPolicy() para permitir esta llamada. (Y para aquellos que lean esto porque han encontrado este error en una actividad, no utilice StrictMode para ocultar este error, utilice un AsyncTask)

-¿o debería usar una AsyncTask? Y en ese caso, ¿cuál es el problema aquí? ¿No está el servicio en un hilo separado de la actividad?

A pesar de que el servicio está destinado a procesamiento de fondo que se ejecutan en el hilo principal .

Una breve cita de la documentación :

Precaución: Un servicio se ejecuta en el mismo proceso que la aplicación en la que se declara y en el subproceso principal de esa aplicación, de forma predeterminada. Por lo tanto, si su servicio realiza operaciones intensivas o de bloqueo mientras el usuario interactúa con una actividad de la misma aplicación, el servicio ralentizará el rendimiento de la actividad. Para evitar impactar el rendimiento de la aplicación, debe iniciar un nuevo subproceso dentro del servicio.

El 'procesamiento en segundo plano' significa que el servicio no tiene interfaz de usuario, puede ejecutarse incluso si el usuario no está interactuando directamente con la aplicación. Pero todo el procesamiento en segundo plano sigue ocurriendo en el hilo principal de forma predeterminada.

Entonces, ¿cómo resolverlo y deshacerse de la excepción? Como la documentación sugiere que usted tiene que utilizar un hilo de fondo. En su servicio puede utilizar AsyncTask o crear hilos directamente. Pero supongo que IntentService podría ser el más adecuado en su caso. IntentService procesa las solicitudes en el subproceso de fondo (de modo que es el tipo de servicio que estaba buscando).

  • Iniciar servicio desde la notificación
  • La notificación de la barra de estado de Android lanza una nueva aplicación aunque esté en ejecución. ¿Cómo sincronizar la aplicación de lanzamiento desde el icono de la aplicación y la notificación de barra de estado?
  • Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
  • Detener el servicio de fondo Cuando la aplicación va al fondo
  • ¿Cómo actualizar un TextView en una actividad de un servicio en Android?
  • El servicio de Android solo se inicia en modo de depuración
  • El servicio de fondo de Android se está reiniciando cuando se cancela la aplicación
  • Servicio con cola de prioridad en Android
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () en CountDownTimer
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • Servicio de Android - URL de ping
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.