1

いくつかのイベントに反応するプロセスがあります。playFromList()が呼び出されると、soundpool からサウンドが再生されます。次に、スレッドでフラグを設定すると、3,5秒間サウンドが再生されません。

私が得たのは、音を鳴らし、3.5秒待つことです。playFromList()が 3.5 秒で 5 回呼び出された場合でもSoundManager.playSound(listNr)に到達し、17.5 秒で完了します。そして、それはまさに私が望んでいたものではありません。SoundManager.playSound(listNr)一度だけ呼び出されるメソッドが欲しかった。

public class Settings{
    public static boolean flag = false;
}

 public class Main{
 public void playFromList(int listNr,int g){

        if(!Settings.flag){
            SoundManager.playSound(listNr);
            if(g ==0){
                mpVolume((float) 0.3);
                t5sec.run();
            }else{pauseMus();}      
        }           
    }

        private Handler vijfSeconden = new Handler(){
            public void handleMessage(Message msg){
                mpVolume((float)0.8);
            }
        };
        Thread t5sec = new Thread(){
            public void run(){
                if(Settings.flag == false){
                    Settings.flag = true;
                    try {
                        Thread.sleep(3500); 
                    } catch (InterruptedException e) {
                        Settings.flag = false;
                        e.printStackTrace();
                    }
                    vijfSeconden.sendEmptyMessage(0);

                    Settings.flag = false;
                }
            }
        };
 }
4

1 に答える 1

0

コードの問題はほとんどありません。おそらく最も重要なのは t5sec.run() です。Java では、Thread オブジェクトで start メソッドを使用して新しい Thread を開始する必要があります。書かれているように、呼び出しスレッドで実行されます。2 番目の問題は、同期が完全に欠如していることです。それを修正する 1 つの方法は、Settings.flag で boolean の代わりに AtomicBoolean を使用することだと思います。

もう 1 つの問題は、毎回新しいスレッドを開始するのは非常にコストがかかることです。説明から何をしたいのかを正確に伝えるのは少し難しいですが、私の理解が正しければ、次のようにする必要があります。

if ( (System.currentTimeInMillis() - lastTimePlayed) < 3500) {
 playSound();
 lastTimePlayed = System.currentTimeInMillis();
}

それだけで、スレッドは必要ありません。クラスをスレッドセーフにしたい場合は、AtomicInteger を使用して lastTimePlayed 値を保持することをお勧めします。

于 2012-04-13T22:48:04.643 に答える