【问题标题】:Android: Make threads run queued one by one in AlarmBroarcastReceiverAndroid:使线程在AlarmBroarcastReceiver中逐个运行
【发布时间】:2014-10-24 23:21:15
【问题描述】:

请咨询您的意见,我是 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() 每次广播出现时,都会创建新的执行程序,并且线程不在旧执行程序的队列中,而是到新队列,因此它们再次同时运行。

【问题讨论】:

    标签: android multithreading alarmmanager runnable executors


    【解决方案1】:

    在构造函数中创建一个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
        }
    }
    

    【讨论】:

    • 它正在工作!谢谢你,我想我还有很多东西要学,因为我并不完全理解它为什么会起作用。再次感谢您,祝您有美好的一天。
    • 我已经测试了一段时间,但不幸的是它并不总是有效。只要我在应用程序中 - 它工作正常。但是当我关闭应用程序并等待警报时间到来时,多个警报同时出现,它们仍然根据我的日志记录同时运行。
    • 我已经使用应用服务解决了这个问题,该服务在服务类的构造函数中使用了执行程序声明。然后我将数据从alarmbroadcastreceiver 传递到服务队列和线程的执行。谢谢chiastic-security
    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多