【问题标题】:Android - make thread wait for notification or timeout *in real time*Android - 让线程等待通知或超时*实时*
【发布时间】:2012-04-06 18:49:06
【问题描述】:

我在 Android 应用程序中有一个线程,我想在其操作的某个时间点等待:

  1. 来自另一个线程的通知,或
  2. 发生超时,我想实时指定。

目前我(大致)有以下几点:

...
doStuff();
synchronized(this) {
  if (!notificationReceived) wait(TIMEOUTPERIOD);
}
doMoreStuff();
...

在从另一个线程调用的方法中:

synchronized(this) {
  notificationReceived = true;
  notifyAll();
}

这几乎可行。事实上,它一直工作到调试和测试,直到我尝试在现场部署应用程序时才停止工作。因为事实证明 Object.wait() 中的计时器在手机 CPU 进入睡眠状态时停止。和 Thread.sleep() 中的一样。哎呀。

现在,我不介意电话处于睡眠状态时电话不会返回(实际上我认为这是可取的 - 当电话处于睡眠状态时,任何时候都不需要操作的结果),但是如果手机在我的超时时间内处于休眠状态,我希望它在唤醒后立即触发。

有什么我想念的方法吗?我知道我可以在所需时间后使用 AlarmManager 向我发送广播 Intent,并将继续代码放入(什么...?广播接收器?我以前从未这样做过... ) 但这会使我的应用程序的逻辑大大复杂化。那么:有没有更简单的方法可以在我的线程中设置(可取消的)实时延迟?

【问题讨论】:

    标签: android timeout power-management


    【解决方案1】:

    我通过动态注册一个广播接收器来解决这个问题,该广播接收器引用了我想要通知的对象,并在它接收到广播时调用 notifyAll()。然后,我在每次调用 wait() 之前使用 AlarmManager 为其设置警报,如果不是由于超时,则在 wait() 返回后取消警报。

    我认为我的代码中可能存在竞争条件,即超时与外部通知几乎同时发生,但在我的情况下,我认为我是否不时收到重复通知并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多