【问题标题】:Android: Stop a function listen for a click and the resumeAndroid:停止功能监听点击和恢复
【发布时间】:2012-07-17 18:00:41
【问题描述】:

我有一个函数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);     
}

【问题讨论】:

    标签: android audio thread-sleep


    【解决方案1】:

    如果我正确理解了您的问题...您可以使用布尔值并在您完成睡眠后检查它吗?

    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
    }
    

    【讨论】:

      【解决方案2】:

      你需要有效地把你的程序彻底颠覆,让它完全由事件驱动。

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

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

      如果你得到用户输入,如果它还没有运行它的 TimerTask,你就取消定时器。根据用户输入,您可以修改待办事项列表、记录某些内容或设置输出。

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-13
        • 2019-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多