Androidアプリケーションに、次のいずれかの操作の特定の時点で待機したいスレッドがあります。
- 別のスレッドからの通知、または
- リアルタイムで指定したいタイムアウトが発生します。
現在、私は(大まかに)次のものを持っています:
...
doStuff();
synchronized(this) {
if (!notificationReceived) wait(TIMEOUTPERIOD);
}
doMoreStuff();
...
別のスレッドから呼び出されたメソッドでは、次のようになります。
synchronized(this) {
notificationReceived = true;
notifyAll();
}
これはほとんど機能します。実際、デバッグとテストの間ずっと機能し、アプリケーションをフィールドにデプロイしようとしたときにのみ機能を停止しました。これは、電話のCPUがスリープ状態になると、Object.wait()のタイマーが停止することが判明したためです。Thread.sleep()のものもそうです。おっと。
今、私は電話が眠っている間は電話が戻らないことを気にしません(実際にはこれは望ましいと思います-電話が眠っているときはアクションの結果は必要ありません)が、電話がタイムアウト期間中はスリープします。ウェイクアップしたらすぐにアクションをトリガーしたいと思います。
これを行うために私が見逃している方法はありますか?必要な時間の後にAlarmManagerを使用してブロードキャストインテントを送信し、継続コードを(what ...?BroadcastReceiver?これまでに行ったことがない...)に入れることができることはわかっていますが、これはかなり複雑になります。私のアプリケーションのロジック。だから:(キャンセル可能な)リアルタイムの遅延をスレッドに入れる簡単な方法はありますか?