121 votes

BroadcastReceiver.onReceive est-il toujours exécuté dans le thread d'interface utilisateur?

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?

173voto

CommonsWare Points 402670

BroadcastReceiver.onReceive est-il toujours exécuté dans le thread d'interface utilisateur?

Oui.

77voto

TommyTh Points 487

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.

67voto

Caner Points 15625

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 valide Handler 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

Les détails ici et ici.

9voto

Mr_and_Mrs_D Points 4569

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X