2012-07-17 86 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在此后立即执行,并处理它从标志发现的用户输入。