簡體   English   中英

如何安排后台線程在應用程序中播放聲音?

[英]How can I schedule a background thread to play sounds in my app?

我有一個應該對某些事件做出反應的過程。 因此,當playFromList() ,它將播放聲音池中的聲音。 然后在線程中設置一個標志,並在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;
                }
            }
        };
 }

代碼幾乎沒有問題。 可能最重要的事情是t5sec.run(),在Java中,您應該在Thread對象上使用start方法來啟動新的Thread。 如所寫,它將在調用線程中執行。 第二個問題是絕對缺乏同步,我認為一種解決此問題的方法是使用AtomicBoolean而不是Settings.flag中的布爾值。

另一個問題是每次啟動新線程都非常昂貴。 從描述中很難准確地知道您想做什么,但是如果我的理解是正確的,您應該做這樣的事情:

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

就是這樣,不需要線程。 如果您希望類是線程安全的,則可能要使用AtomicInteger來保存lastTimePlayed值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM