0

私は次のことを行うためのアプリケーションを開発しています。

ボタンを押すと、アプリケーションは2秒間、5回続く音を再生します。サウンドを5回再生した後、アプリケーションは30秒間スリープします。寝た後、このサイクルがさらに2回繰り返されます。

私の問題は、5回目の再生後に音が止まらないことです。forループまたはwhileループを使用する必要があると思いますが、正しくプログラムできません。

ループ:

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

sound.stop();

さて、今私はこのコードを作成しましたが、彼の唯一の欠点は「for」が正しく機能していないことです...彼は彼の内部にあるコードを2回繰り返していません。誰かが私に理由を教えてもらえますか?

              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 ループ ヘッダーの 2 番目の部分は、本文を入力するために保持する必要がある条件です。i=0i == 5一致しないので、最初から条件が間違っていて入ったことはありません。

体験したい

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

また

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

代わりは。

しかし、どこがiインクリメントされているか、または何らかの形で変更されているのでしょうか? 常に false であるブロックでは、つまり、決してありません。

多分あなたはそれを表現したいでしょう、前の声明が間違っているなら、そうしてください...

これを行うには、次のステートメントを否定します。

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

サウンドの再生がブロックされているかどうかを知らずに、それを制御する方法を知ることは困難です。

要件を読んで、最初からやってみましょう。

ボタンを押すと、アプリケーションが 2 秒間のサウンドを 5 回再生します。サウンドを 5 回再生した後、アプリケーションは 30 秒間スリープします。寝た後、このサイクルがさらに2回繰り返されます。

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

これら2つを調整して組み合わせると、効果を上げることができます...

編集:解決策(未テスト)

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 に答える