2012-04-06 7 views
1

私はどちらかのためにその動作中に特定のポイントで待機したいAndroidアプリケーション内のスレッドがあります。アンドロイド - *リアルタイムで*通知またはタイムアウトのためのスレッドを待機させる

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

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

    、別のスレッドから呼び出されるメソッドで::これはほとんどの作品

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

は現在、私は次の(おおよそ)があります。実際には、デバッグとテストのすべてを通して機能し、現場でアプリケーションをデプロイしようとしたときには動作しなくなりました。電話CPUがスリープ状態になると、Object.wait()内のタイマーが停止することが判明したためです。 Thread.sleep()の場合と同様です。おっとっと。

電話が眠っている間に電話が戻ってこないことは気になりません(実際には私はこれが望ましいと考えています。電話が眠っているときはいつでもその結果は必要ありません)。私のタイムアウト期間中、電話がスリープ状態になると、起きるとすぐにトリガーするようにしたいと思います。

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

答えて

0

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

タイムアウトが外部通知とほぼ同じタイミングで発生する競合状態が発生している可能性がありますが、私の場合は時折重複した通知があっても問題ではないと判断しました。

関連する問題