通过UI线程还是非UI线程发送广播?

4

在性能方面,将广播(在我这个例子中是ACTION_APPWIDGET_UPDATE)发送到单独的线程中比在UI线程上运行(使用Runnable)更好吗?或者在UI线程上这样做是可接受的做法?

5个回答

5
你可以在sendBroadcast的文档中了解到:

此调用是异步的;它会立即返回,而接收器在运行时您将继续执行。

因此,在UI线程上调用它是完全安全的。


1
发送广播不是一个耗时的过程。因此,您也可以从主线程(UI 线程)发送广播。

真的,但您认为通过可运行程序这样做对应用程序/手机来说会更轻便吗?使用可运行程序会有任何不利影响吗? - Mehmet K

1
Broadcasts总是异步发送的,您不需要在单独的线程中运行它以避免阻塞UI线程。sendBroadcast()已经是非阻塞的。来自sendBroadcast的文档

public abstract void sendBroadcast (Intent intent)

将给定的意图广播到所有感兴趣的BroadcastReceivers,允许强制执行可选的所需权限。此调用是异步的;它立即返回,而您将继续执行,同时接收器正在运行...


1
在我的一些应用程序中的开发者控制台中,当调用“sendBroadcast”多次时,在某些设备上(少于0.5%)我会检查ANR(UI线程阻塞)。为了解决这个问题,我在后台线程中调用sendBroadcast。因此,即使它是异步的,如果你调用它很多次,它也可能被阻塞。

0

正如您所知,BroadcastReceiver.onReceive始终在UI线程中运行。如果您动态注册接收器,则可以指定另一个线程处理onReceive()。这是通过registerReceiver()的Handler参数完成的。

因此,最好还是通过UI使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接