2

我有一个功能playsounds(),它基本上一次又一次地播放相同的声音文件,但是float每次都有不同的称为“平衡”的值。每次播放后,我希望该功能停止并收听用户点击不同的Button. 如果没有点击,则调用下一个播放。

但是,如果用户单击,那么我想记录该余额值。我的问题是,一旦我启动该功能,就无法在两者之间停止它。所以即使我点击,它也不会被注意到。

你能帮我解决这个问题吗?

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

2 回答 2

0

你需要有效地把你的程序从里到外翻过来,让它完全由事件驱动。

基本上,您有一个计时器和用户作为事件的来源。你有一个变量来保存你当前的任务状态,还有一个你接下来要做什么的待办事项列表。

您从待办事项列表中开始一项操作,并在一段时间内启动一个计时器,直到您接下来在没有用户输入的情况下执行某项操作。

如果您获得用户输入,如果计时器尚未运行其 TimerTask,则您取消计时器。根据用户输入,您可以修改待办事项列表、记录某些内容或设置输出。

如果 TimerTask 在您获得用户输入之前运行,您只需执行列表中的下一件事。

由于 TimerTask 和用户输入发生在不同的线程上,因此您需要一种机制来确保一次只能发生一个。一个简单的解决方案是让它们都调用一个同步的方法来完成真正的工作,提供事件的类型作为参数。另一种想法是设置一个同步的标志寄存器来记录用户输入,然后重新调度计时器,以便 TimerTask 之后立即执行,并让它处理它从标志中发现的用户输入。

于 2012-07-17T19:42:53.390 回答
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
}
于 2012-07-17T18:10:35.057 回答