1

Androidアプリケーションに、次のいずれかの操作の特定の時点で待機したいスレッドがあります。

  1. 別のスレッドからの通知、または
  2. リアルタイムで指定したいタイムアウトが発生します。

現在、私は(大まかに)次のものを持っています:

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

別のスレッドから呼び出されたメソッドでは、次のようになります。

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

これはほとんど機能します。実際、デバッグとテストの間ずっと機能し、アプリケーションをフィールドにデプロイしようとしたときにのみ機能を停止しました。これは、電話のCPUがスリープ状態になると、Object.wait()のタイマーが停止することが判明したためです。Thread.sleep()のものもそうです。おっと。

今、私は電話が眠っている間は電話が戻らないことを気にしません(実際にはこれは望ましいと思います-電話が眠っているときはアクションの結果は必要ありません)が、電話がタイムアウト期間中はスリープします。ウェイクアップしたらすぐにアクションをトリガーしたいと思います。

これを行うために私が見逃している方法はありますか?必要な時間の後にAlarmManagerを使用してブロードキャストインテントを送信し、継続コードを(what ...?BroadcastReceiver?これまでに行ったことがない...)に入れることができることはわかっていますが、これはかなり複雑になります。私のアプリケーションのロジック。だから:(キャンセル可能な)リアルタイムの遅延をスレッドに入れる簡単な方法はありますか?

4

1 に答える 1

0

通知したいオブジェクトへの参照を持つBroadcastReceiverを動的に登録し、ブロードキャストを受信したときにnotifyAll()を呼び出すようにすることで、この問題を解決しました。次に、AlarmManagerを使用して、wait()を呼び出す前にアラームを設定し、タイムアウトが原因でない場合は、wait()が戻った後にアラームをキャンセルしました。

コードには、外部通知とほぼ同時にタイムアウトが発生する競合状態があると思いますが、私の場合は、通知が重複しているかどうかは問題ではないと判断しました。

于 2012-04-10T09:25:13.863 に答える