2012-07-17 34 views
2

我有一個功能playsounds()它基本上一次又一次地播放相同的聲音文件,但每次有不同的值稱爲「平衡」float。每次播放後,我希望該功能停止並聽用戶點擊不同的Button。如果沒有點擊,則調用下一個播放。Android:停止功能傾聽點擊和恢復

但是,如果用戶點擊那麼我想記錄該值的平衡。我的問題是,一旦我啓動該功能,就無法在兩者之間停止它。所以,即使我點擊,它也不會被察覺。

你能幫我解決問題嗎?

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);  
} 

回答

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 
} 
0

您需要有效的把你的程序裏面出來,並使其完全事件驅動的。

基本上,你有一個計時器和用戶作爲事件的來源。你有一個變量來保存你當前的任務狀態,以及下一步要做的事情。

您從待辦事項列表開始操作,並在一段時間內啓動一個計時器,直到您接下來將執行某些沒有用戶輸入的操作。

如果您得到用戶輸入,如果它還沒有運行TimerTask,則取消定時器。根據用戶輸入,您可以修改您的待辦事項列表,記錄內容或設置輸出。

如果TimerTask在獲得用戶輸入之前運行,則只需執行列表中的下一件事。

由於TimerTask和用戶輸入發生在不同的線程上,因此您需要一種機制來確保一次只能有一個發生。一個簡單的解決方案是讓他們都調用一個同步的方法來完成真正的工作,提供事件類型作爲參數。另一種想法是設置一個同步標誌寄存器來記錄用戶輸入,然後重新調度定時器,以便TimerTask在此後立即執行,並處理它從標誌發現的用戶輸入。