当前位置: 首页 > 知识库问答 >
问题:

Android:在AlarmBroarcastReceiver中让线程逐个排队运行

苏彦君
2023-03-14

请征求您的意见,我是Android编程新手。

我正在编写一个类似闹钟的软件,并使用公共类AlarmManagerBroadcastReceiver扩展BroadcastReceiver来捕获AlarmManager之前设置的警报
为了不中断UI,我在这个类的公共void onReceive(Context-Context,Intent-Intent)中使用新线程。一般情况如下:

公共类AlarmManagerBroadcastReceiver扩展BroadcastReceiver{

 public void onReceive(Context context, Intent intent) {

        Executors.newSingleThreadExecutor().submit(new Runnable() {
                  public void run() { 
                          ... //useful code
        }
 }

}

有时我的应用程序会面临多个广播同时出现的情况。这会导致同时执行多个线程,我不想发生这种情况,因为它会干扰有用的代码。

我希望线程进入队列并一个接一个地运行。如果您以前遇到过这种情况,请您提供建议,我有什么办法可以做到这一点吗?

据我所知,问题是我是遗嘱执行人 newSingleThreadExecutor()每次广播出现时,都会创建新的执行器,线程不会出现在旧的队列中,而是出现在新队列中,因此它们再次同时运行。

共有1个答案

穆丁雨
2023-03-14

在构造函数中创建SingleThreadExecutor;然后,在onReceive中,将新的Runnable传递给您已经获得的SingleThreadExecutor。

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

  private ExecutorService executor;

  public AlarmManagerBroadcastReceiver {
    executor = Executors.newSingleThreadExecutor();
  }

  public void onReceive(Context context, Intent intent) {

    executor.submit(new Runnable() {
              public void run() { 
                      ... //useful code
    }
}
 类似资料:
  • 我是一个新手,但我真的很喜欢长轮询的想法。 在阅读了它之后,我会这样实现它: 客户端请求服务器(AJAX) 服务器正在轮询DB以获取更改 识别更改时或服务器响应超时后 我的问题是,对于每一个请求,都在服务器上启动一个线程,并且每个线程都轮询DB。 在服务器上运行一个接受所有传入请求的线程不是更有效吗?例如: 客户端请求服务器(AJAX) 服务器将请求添加到队列(无响应) 辅助线程轮询数据库以获取与

  • 我对Azure服务总线队列还比较陌生,正在构建一个项目,该项目需要按照消息到达的顺序(FIFO)处理队列中的消息。 使用微软的文档,我能够理解这一部分。据我所知,我需要为队列打开会话? 我所面临的困难是确定对队列执行以下一组有序任务的最佳方法/服务堆栈。 首先,让我们假设我们有一个基于先进先出的服务总线队列,它有n个消息。我怎么可能: 从队列中拾取第一条消息。 使用Azure函数处理消息。 将有效

  • 在一个android服务中,我创建了用于执行一些后台任务的线程。 我遇到一个情况,线程需要在主线程的消息队列上发布特定任务,例如。 有没有方法获取主线程的并从我的另一个线程向它发布/?

  • 我只是花了一些时间试图将现有的android studio项目从Gradle1.8迁移到Gradle1.9final(昨天11月19日发布),但失败了。 我在这里读了大多数其他与年级相关的帖子,但没有一个对我有用。以下是我到目前为止尝试过的内容: null

  • 在UI线程中运行代码的观点中,以下两者之间有什么区别吗: 或 而且

  • 我是Android新手,我正在尝试如何做到这一点:-我有一个带有ScrollView的活动,其中有一个LinearLayout(R.id.my_layout)-我需要以编程方式添加TextView,所以我正在做: 我通过seContentView加载主XML布局,我在ScrollView中将我的LinearLayout称为“mLayout”等等。我从文件中加载一个名称列表,并使用一个名为填充列表(