0

我正在开发一个应用程序来执行以下操作:

当您按下按钮时,应用程序会播放持续两秒、五次的声音。第五次播放声音后,应用程序休眠 30 秒。睡觉后,这个循环再重复两次。

我的问题是第五次播放后我无法停止声音。我想我需要使用 for 循环或 while 循环,但我无法正确编程它们。

循环:

for(i=0; i==5; ) {
    sound.start(); 
    if(sound.isPlaying()) {
        if(false) { 
            sound.stop(); 
            i++; 
        } 
    }
}

sound.stop();

好吧,现在我构建了这段代码,但他唯一的错误是“for”不能正常工作……他没有重复他体内的代码两次。有人可以告诉我为什么吗?

              for( counter=0; counter<2; ++counter){

                new CountDownTimer(20000, 2000) {       
                    public void onTick(long millisUntilFinished) {
                    //call to my UI thread every 2 seconds  
                     sound.start();    
                   }

                   public void onFinish() {          
                   //final call to my UI thread after 10 seconds

                       chrono2.setBase(SystemClock.elapsedRealtime());
                       chrono2.start();

                       chrono2.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

                           public void onChronometerTick(Chronometer chronometer) {
                               // TODO Auto-generated method stub
                               long elapsedTime = SystemClock.elapsedRealtime()-chronometer.getBase();
                               Log.i(this.getClass().getName(), "" + elapsedTime);

                               if (elapsedTime > 10000){
                                   chrono2.stop();
                                   chrono2.setBase(SystemClock.elapsedRealtime());
                                   Toast.makeText(getApplicationContext(), "" , Toast.LENGTH_SHORT).show();
                               }
                           }
                       });

                    } // end onFinish   
                }.start(); // end count down
            }
4

4 回答 4

2
for(i=0; i==5; ) {
    sound.start(); 
    if(sound.isPlaying()) {
        if(false) { 
            sound.stop(); 
            i++; 
        } 
    }
}    
sound.stop();

for 循环头的第二部分是一个条件,它必须保持才能进入正文。i=0并且i == 5不匹配,所以条件从一开始就是错误的并且从未进入。

你想表达

 for(i=0; i!=5; ) {

或者

 for(i=0; i<5; ) {

反而。

但是在哪里i增加或以其他方式改变了?在一个总是错误的块中,换句话说:从不。

也许你想表达,如果前面的陈述是错误的,那么......

您可以通过否定声明来做到这一点:

    if (! sound.isPlaying ()) { 
            sound.stop(); 
            i++; 
    }

在不知道声音播放是否阻塞的情况下,很难知道如何控制它。

让我们阅读需求并从头开​​始:

当您按下按钮时,应用程序会播放持续两秒、五次的声音。第五次播放声音后,应用程序休眠 30 秒。睡觉后,这个循环再重复两次。

您有 3 次的外循环和 5 次的内循环。

for (int i=0; i < 3; ++i) {
    for (int j=0; j < 5; ++j) {
        sound.start(); 
        sleep (2); // seconds of sound
    } 
    sleep (30); // seconds of silence
}    
于 2012-06-20T11:11:37.710 回答
0

这很容易,您只需要使用倒数计时器:

new CountDownTimer(10000, 2000) {       
    public void onTick(long millisUntilFinished) {          
    //call to my UI thread every 2 seconds  
     playSound();    
   }       
   public void onFinish() {          
   //final call to my UI thread after 10 seconds     
    }   
}.start();

并使用一个简单的定时器来休眠 30 秒:

new Handler().postDelayed(new Runnable() {         
  @Override         
  public void run() {             
   //do after 30 seconds              
  }     
 }, 30000);

通过调整和结合这两者,你可以使你的效果......

编辑:一个解决方案(未经测试)

int repeatAlarm = 3; //above onCreate
....

playSoundFiveTimes(); //in onCreate


.......

private void playSoundFiveTimes(){

 new CountDownTimer(10000, 2000) {       
    public void onTick(long millisUntilFinished) {          
     sound.stop();
     sound.start();        
    }       
   public void onFinish() {          
      repeatAlarm--;
      if(repeatAlarm > 0) wait30seconds(); 
    }   
 }.start();
}


 private void wait30seconds(){

  new Handler().postDelayed(new Runnable() {         
      @Override         
      public void run() {             
       playSoundFiveTimes();            
      }     
     }, 30000);
 }
于 2012-06-16T18:48:04.280 回答
0

只需在您的 while 循环中保留一个计数器变量,该变量将告诉应用程序在达到 5 时进入睡眠状态。伪代码是这样的:

final int REPEAT_RATE = 5;
int counter = 0;
while(counter < 3 * REPEAT_RATE)
{
    if(counter == REPEAT_RATE) 
    {
        //Sleep for thirty seconds
    }
    //Here Play the sound for 2 seconds
}
于 2012-06-16T13:31:27.677 回答
0

这是我的解决方案:
您可以使用 seekTo(0) 函数然后 mp 重新开始!

private void startCountDownTimer() {
    cdTimer = new CountDownTimer(total, 1000) {
        public void onTick(long l) {

            mp.seekTo(0);
            mp.start();
}


        public void onFinish() {
            mp.stop();
            MediaPlayer doneMp = MediaPlayer.create(getApplicationContext(), R.raw.finished_challenge);
            doneMp.start();


        }
    }.start();
}
于 2015-07-10T11:14:23.377 回答