广播接收器 onReceive() 线程安全吗?

6

BroadcastReceiveronReceive()方法是否线程安全,或者我需要自己实现同步?

如果我有任何类级别变量在onReceive()方法中使用,并且onReceive()方法被快速地多次调用,那么会引起问题吗?

public class MyBroadCastReceiver extends BroadcastReceiver {

    boolean isFirstTrigger = true;

    @Override
    public void onReceive(Context context, Intent arg1) {
      if(isFirstTrigger)
       {
        //Do something time consuming
        isFirstTrigger = false;
       }
      }
1个回答

7

onReceive()方法是BroadcastReceiver线程安全的吗?还是我需要自己实现同步?

该方法只会在主应用程序线程上调用。因此,与主应用程序线程上运行的任何其他内容相比,它是线程安全的。

如果我有任何类级别变量被用于onReceive()方法,并且onReceive()方法被快速地多次调用,这会导致问题吗?

如果BroadcastReceiver在清单中注册,则为每个广播创建一个新实例。这就是为什么通常不会在BroadcastReceiver上看到数据成员的原因。


1
@Manish:“他们不会同时访问SharedPreference吗?”--正如我所写的那样,onReceive()在主应用程序线程上调用。每个进程有一个主应用程序线程。因此,默认情况下,您可以保证这三个广播将串行运行。 - CommonsWare
1
广播接收器在清单文件中注册(用于网络连接/断开事件),即使如此,它也会被串行调用吗? - Manish
2
@Manish:好的,这次让我们尝试加粗斜体:***onReceive() 在主应用程序线程上调用。无论您在哪里注册接收器,onReceive() 都会在主应用程序线程上调用。无论广播发送多少次,onReceive() 都会在主应用程序线程上调用。无论您的 Intent 过滤器是什么样子,onReceive() 都会在主应用程序线程上调用***。由于只有一个主应用程序线程,根据定义,onReceive() 必须按顺序执行。 - CommonsWare
1
讲解得非常清晰易懂。谢谢@CommonsWare!让我困惑的是BroadcastReceiver是通过清单文件注册的,而不是通过我的任何服务/活动注册的。但我明白它作为应用程序进程的一部分运行,并且只有一个主线程。 - Manish
1
@Hey-men-whatsup:“这样可以吗?”-- 我无法真正回答这个问题。onReceive()在主应用程序线程上调用。广播发送者使用的线程并不重要。毕竟,对于系统广播,发送者位于完全分离的应用程序中。这种行为是否可以接受取决于您自己的决定,因为我不知道什么是可以接受的或不可以接受的。 - CommonsWare
显示剩余5条评论

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