2

基本的に同じサウンドファイルを何度も再生する機能がありますが、毎回「バランス」と呼ばれるplaysounds()値が異なります。float再生するたびに、関数を停止して、ユーザーが別のをクリックするのをリッスンしたいと思いますButton。クリックがない場合、次のプレイが呼び出されます。

ただし、ユーザーがクリックした場合は、その残高の値を記録します。私の問題は、関数を開始すると、その間に停止する方法がないことです。だからクリックしても見過ごされてしまいます。

問題を解決するのを手伝ってくれませんか。

public void playsounds() throws InterruptedException
    { 

    snd.setBalance(0);
    snd.play(table);
    Thread.sleep(2000);
    tv.setText("Pressed at first call ");

    snd.setBalance(0.04f);
    snd.play(table);
    Thread.sleep(2000);
    tv.setText("Pressed at second call ");

    snd.setBalance(0.08f);
    snd.play(table);
    Thread.sleep(2000);
    tv.setText("and so on...");

    snd.setBalance(0.12f);
    snd.play(table);
    Thread.sleep(2000);

    snd.setBalance(0.16f);
    snd.play(table);
    Thread.sleep(2000);

    snd.setBalance(1.0f);
    snd.play(table);
    Thread.sleep(2000);

    snd.setBalance(1.84f);
    snd.play(table);
    Thread.sleep(2000);

    snd.setBalance(1.88f);
    snd.play(table);
    Thread.sleep(2000);

    snd.setBalance(1.92f);
    snd.play(table);
    Thread.sleep(2000);

    snd.setBalance(1.96f);
    snd.play(table);
    Thread.sleep(2000);    

    snd.setBalance(2.0f);
    snd.play(table);
    Thread.sleep(2000);     
}
4

2 に答える 2

0

私があなたの質問を正しく理解しているなら...あなたはブール値を使用して、あなたが眠り終わった後にそれをチェックすることができますか?

public class MyClass implements OnClickListener{

         private boolean buttonClick;

         public void playSounds(){
              //play sound
              // sleep
              if(buttonClick){
                  buttonClick = false;
                  //perform action or return
              }
         }

         public void onClick(){
              buttonClick = true;
         }
    }

これがメインスレッド上にある場合、Thread.sleep()を呼び出すことはおそらく最良のオプションではなく、瞬時に応答することはできません。関数を小さくして、何度も呼び出すこともできます。

public void playSound(float fValue){
    snd.setBalance(fValue);
    snd.play(table);
    //sleep
}
于 2012-07-17T18:10:35.057 に答える
0

プログラムを効果的に裏返しにし、完全にイベント駆動型にする必要があります。

基本的に、イベントのソースとしてタイマーとユーザーがあります。現在のタスクの状態を保持する変数と、次に行うことのToDoリストがあります。

To Doリストから操作を開始し、ユーザー入力がない場合に次に何かを実行するまでの期間、タイマーを開始します。

ユーザー入力を受け取った場合、TimerTaskがまだ実行されていなければ、タイマーをキャンセルします。ユーザー入力に基づいて、やることリストを変更したり、何かを記録したり、出力を設定したりできます。

ユーザー入力を取得する前にTimerTaskが実行された場合は、リストの次のことを実行するだけです。

TimerTaskとユーザー入力は異なるスレッドで発生するため、一度に1つだけが発生することを保証するメカニズムが必要になります。簡単な解決策は、イベントのタイプをパラメーターとして提供して、実際の作業を行う同期メソッドを両方に呼び出させることです。別のアイデアは、ユーザー入力を記録する同期フラグレジスタを設定し、タイマーを再スケジュールして、TimerTaskがすぐに実行されるようにし、フラグから検出したユーザー入力を処理することです。

于 2012-07-17T19:42:53.390 に答える