我正在开发一个应用程序来执行以下操作:
当您按下按钮时,应用程序会播放持续两秒五次的声音。在第五次播放声音后,应用程序会休眠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
}
答案 0 :(得分: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
}
答案 1 :(得分: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
}
答案 2 :(得分: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);
}
答案 3 :(得分: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();
}