2011-11-08 6 views
1

J'effectue une opération réseau à partir d'un BroadcastReceiver. Cette opération est en cours en arrière-plan et l'application ne sera pas exécutée lorsque cela se produit.Que faire pour effectuer une opération réseau en arrière-plan?

Quel est le meilleur à utiliser? Un Service ou un AsyncTask?

+2

duplication possible de [Android: AsyncTask vs Service] (http://stackoverflow.com/questions/6957775/android-asynctask-vs-service) –

+2

Je dirais que ce n'est pas un doublon, il y a des considérations spécifiques lors de l'utilisation un BroadcastReceiver. Dans ce cas précis, un service doit être utilisé. –

Répondre

2

Un objet BroadcastReceiver n'est valide que pendant la durée de l'appel à onReceive(). Une fois que votre code revient de cette fonction, le système considère que l'objet est terminé et n'est plus actif. Il est donc logique d'utiliser un AsyncTask ou un Thread ici.

également de la documentation:

vous ne pouvez pas, en particulier, afficher une boîte de dialogue ou se lient à un service à partir d'un BroadcastReceiver.


Si cette BroadcastReceiver a été lancé par une balise <receiver>, l'objet ne soit plus en vie après le retour de cette fonction. Cela signifie que vous ne devez pas effectuer d'opérations qui vous renvoient un résultat de manière asynchrone - en particulier, pour interagir avec les services, vous devez utiliser startService() au lieu de bindService(). Si vous souhaitez interagir avec un service qui est en cours d'exécution, vous pouvez utiliser peekService()

Ce que cela signifie est que vous pouvez startService() de votre RCVR de diffusion, transmettre les données nécessaires à l'exploitation de votre réseau à travers une intention. Le service fera l'opération de réseau. Si le service est collant, vous pouvez utiliser peekService(). Mais jamais vous ne devriez bindService() à un Broadcast rcvr.

+0

La citation la plus pertinente est 'Cela signifie que pour les opérations de plus longue durée, vous utiliserez souvent un Service en conjonction avec un BroadcastReceiver pour garder le processus contenant actif pendant toute la durée de votre opération.' –

+0

Hmm merci, j'ai raté ça, vous signifie en utilisant 'registerReceiver()'? – Reno

+0

Le point est vraiment que vous devriez commencer un service dans votre BroadcastReceiver pour faire un travail réel et revenir du récepteur dès que possible. Vous pouvez transmettre des données au service via une intention. –

2

Mieux utiliser un service. AsyncTask est principalement de ne pas bloquer l'interface utilisateur.

Questions connexes