Android - 让线程实时等待通知或超时*

时间:2012-04-06 18:49:07

标签: android timeout power-management

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

  1. 来自其他主题的通知,或
  2. 发生超时,我想实时指定。
  3. 目前我(大致)有以下内容:

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

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

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

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

    现在,我不介意在手机睡眠时呼叫不会返回(实际上我认为这是可取的 - 当手机处于睡眠状态时,不需要动作的结果),但是如果手机在我的超时时间内休眠,我希望该动作一旦唤醒就会触发。

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

1 个答案:

答案 0 :(得分:0)

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

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