2011-06-24 17 views
0

今、私はブール値flag1 == trueの間に音量を上げる関数を作ろうとしています。だから私がやりたいことは音量を上げること(私はこれを行うことができる)で、何もしないで( "nop")待ってからフラグを再度チェックすることです。Android - タスクを実行し、何もしないでもう一度タスクを実行しますか?

私はThread.sleep()でwhileループを実行しようとしましたが、ちょっと信頼できない動作をしました。私はフラグをチェックすることが重要ですので、私は複数回起動されているかもしれないサービス内からこの関数を呼び出すことに注意してください。

は、ここで私が試したもののサンプルです:

private void cycleVolume() { 

    while (flag1 == true) { 

     mAudioManager.adjustVolume(AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND); 

     try { 
      Thread.sleep(750); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

} 

FLAG1がうまくいけば、この関数の実行を停止する必要がありBroadcastReceiverイベント、から偽になります。しかし、テストでは、これが起こるはずの後、これはかなりの間は起こらないことに気がつきました。そして、私がそこに問題があることを推測する前に、スレッドで多くのことをやったことがないからです。

私は代わりに何をしていますか?

ありがとうございました。

+0

どのようにフラグを更新しますか? – Gix

+0

このフラグは、メディアボタンの押下を待ち受けるBroadcastReceiverによって非同期に変更されます – JDS

答えて

2

私はあなたが正しいことをやっているかどうかはわかりませんが、現在のコードを修正する方法があります。

1)フラグをvolatileに変更します。

2)フラグに同期ゲッターとセッターメソッドを提供します。

この問題は、Javaのメモリモデルによって発生します。同じフィールドにアクセスする2つのスレッドがあるため、アクセスを同期させる方法を提供する必要があります。今、2つのスレッドは、共有フィールドの互いの変更を見ることができません。揮発性を使用する単純なブール値の場合はおそらくより効率的です。

0

このコードは独自のスレッドで実行されていますか?サービスのどこかから開始されていますか?別のスレッドを作成していない場合、これはプロセスのメインスレッド上で実行されており、それをブロックしており、予測できない結果につながる可能性があります。

関連する問題