[英]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.