dans mon application, je crée une BroadcastReceiver
et l'enregistre manuellement dans mon contexte via Context.registerReceiver
. J'ai aussi un AsyncTask
qui envoie des intentions notifiantes via Context.sendBroadcast
. Les intentions sont envoyées par un thread de travail non-UI, mais il semble que BroadcastReceiver.onReceive
(qui reçoit lesdites intentions) s'exécute toujours dans le fil de l'interface utilisateur (ce qui est bon pour moi). Est-ce garanti ou ne devrais-je pas compter sur cela?
Réponses
Trop de publicités?Puisque vous enregistrer dynamiquement le récepteur, vous pouvez spécifier qu'un autre thread (que le thread d'INTERFACE utilisateur) poignées de le recevoir. Cela se fait par le Gestionnaire de paramètre de registerReceiver().
Cela dit, si vous ne l'avez pas spécifier un autre Gestionnaire, il vous a traité sur le thread de l'INTERFACE utilisateur de toujours.
Ne BroadcastReceiver.onReceive toujours exécuté dans le thread de l'INTERFACE utilisateur?
Habituellement, tout dépend de la façon dont vous vous inscrivez.
Si vous enregistrez votre
BroadcastReceiver
l'aide de:registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
Il sera exécuté dans le principal de l'activité de filetage(aka thread d'INTERFACE utilisateur).
Si vous enregistrez votre
BroadcastReceiver
à l'aide d'un valideHandler
en cours d'exécution sur un autre thread:registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
Il sera exécuté dans le contexte de votre
Handler
Par exemple:
HandlerThread handlerThread = new HandlerThread("ht"); handlerThread.start(); Looper looper = handlerThread.getLooper(); Handler handler = new Handler(looper); context.registerReceiver(receiver, filter, null, handler); // Will not run on main thread
Comme les réponses précédentes correctement déclaré onReceive
sera exécuté sur le fil il est enregistré avec si la saveur de l' registerReceiver()
qui accepte un gestionnaire est appelé - sinon sur le thread principal.
Sauf si le récepteur est inscrit auprès de l' LocalBroadcastManager
et la diffusion se fait via sendBroadcastSync
- où il sera apparemment exécuter sur le thread qui appelle sendBroadcastSync.