¿Qué usar para realizar una operación de red en segundo plano?

Estoy realizando una operación de red desde un BroadcastReceiver. Esta operación se realiza en segundo plano y la aplicación no se ejecutará cuando esto suceda.

¿Cuál es mejor usar? A Service o un AsyncTask?

preguntado el 08 de noviembre de 11 a las 10:11

Yo diría que no es un duplicado, hay consideraciones específicas al usar un BroadcastReceiver. En este caso específico, se debe utilizar un Servicio. -

2 Respuestas

Mejor use un Servicio. AsyncTask es principalmente para no bloquear la interfaz de usuario.

respondido 08 nov., 11:15

A BroadcastReceiver El objeto solo es válido durante la duración de la llamada a onReceive (). Una vez que su código regresa de esta función, el sistema considera que el objeto está terminado y ya no está activo. Por lo tanto, tiene sentido usar un AsyncTask o Thread aquí.

También de la documentación :

En particular, es posible que no muestre un cuadro de diálogo ni se vincule a un servicio desde un BroadcastReceiver.


Si este BroadcastReceiver se lanzó a través de un <receiver> , el objeto ya no está vivo después de regresar de esta función. Esto significa que no debe realizar ninguna operación que le devuelva un resultado de forma asincrónica; en particular, para interactuar con los servicios, debe usar startService() en lugar de bindService(). Si desea interactuar con un servicio que ya se está ejecutando, puede utilizar peekService()

Lo que esto significa es que puedes startService() desde su rcvr de transmisión, pase los datos necesarios para el funcionamiento de su red a través de un intent. El servicio hará la operación de la red. Si el servicio es pegajoso, puede usar peekService(). Pero nunca deberías bindService() a un receptor de radiodifusión.

respondido 08 nov., 11:18

La cita más relevante es This means that for longer-running operations you will often use a Service in conjunction with a BroadcastReceiver to keep the containing process active for the entire time of your operation. - David Snabel-Caunt

Mmm gracias, me perdí eso, te refieres al usar registerReceiver()? - Reno

El punto realmente es que debe iniciar un servicio en su BroadcastReceiver para hacer un trabajo real y regresar del Receiver lo antes posible. Puede pasar datos al servicio a través de una intención. - David Snabel-Caunt

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.