Answers:
BroadcastReceiver.onReceive是否始终在UI线程中运行?
是。
onCreate()
,onReceive()
)被称为主应用程序线程上。并且,它在以下文档的文档中进行了记录onReceive()
:goo.gl/8kPuH
onReceive()
在主应用程序(“ UI”)线程以外的线程上调用的任何情况。
由于您是动态注册接收者,因此可以指定另一个线程(UI线程除外)来处理onReceive()
。这是通过registerReceiver()的Handler参数完成的 。
也就是说,如果您未指定其他处理程序,它将始终在UI线程上进行处理。
BroadcastReceiver.onReceive是否始终在UI线程中运行?
通常,这取决于您如何注册。
如果您注册BroadcastReceiver
使用:
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
它将在主活动线程(又名UI线程)中运行。
如果您在其他线程上BroadcastReceiver
使用有效的Handler
运行进行注册:
registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
它将在您的上下文中运行 Handler
例如:
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
正如前面正确回答的答案一样onReceive
,如果registerReceiver()
调用了接受处理程序的代码,它将在注册的线程上运行 -否则在主线程上运行。
除非接收方已向进行注册,LocalBroadcastManager
而广播是通过 sendBroadcastSync
-进行的,则显然它将在调用的线程上运行sendBroadcastSync.
and the broadcast is via sendBroadcastSync
。当我们使用LocalBroadcastManager
注册接收者时,无论使用sendBroadcastSync
还是,主线程都必须调用它sendBroadcast
。所以关键是LocalBroadcastManager
用来注册。我对吗?