Java 取消/停止运行无限代码的asynchtask
我正在尝试使用这里找到的示例类构建metronome 我建立了一个活动,有两个按钮来启动和停止节拍器。 play()方法(生成、保存和播放示例)在布尔值play上使用do{}(while),调用stop()方法时应将其设置为false 起初,我发现按play键时UI被卡住了,所以决定在asynchtask中运行play()方法,但在停止时仍然有问题。我在这里查找了一个类似的问题,并尝试调整while循环以检查isCancelled,同时在stop()方法(和stop按钮侦听器)中调用cancel(),但仍然没有乐趣 我不明白这个解决方案是如何工作的,因为解决方案中的循环或metronome的play()都不允许doinbackground返回任何内容 “调用此方法(cancel())将导致在doInBackground(Object[])返回后在UI线程上调用onCancelled(Object)。” 您是否知道如何更好地实现这一点,以允许play()的执行通过按下按钮来运行和停止 我的runinbackground,将play()的内容放在这里,在我的活动线程中,我创建了一个节拍器m,然后调用m.execute开始,调用m.cancel停止Java 取消/停止运行无限代码的asynchtask,java,android,Java,Android,我正在尝试使用这里找到的示例类构建metronome 我建立了一个活动,有两个按钮来启动和停止节拍器。 play()方法(生成、保存和播放示例)在布尔值play上使用do{}(while),调用stop()方法时应将其设置为false 起初,我发现按play键时UI被卡住了,所以决定在asynchtask中运行play()方法,但在停止时仍然有问题。我在这里查找了一个类似的问题,并尝试调整while循环以检查isCancelled,同时在stop()方法(和stop按钮侦听器)中调用cancel
protected Void doInBackground(Void... params) {
calcSilence();
double[] tick =
soundGen.getSineWave(this.tick, 8000, beatSound);
double[] tock =
soundGen.getSineWave(this.tick, 8000, sound);
double silence = 0;
double[] sound = new double[8000];
int t = 0,s = 0,b = 0;
while(!isCancelled()){
for(int i=0;i<sound.length&&play;i++) {
if(t<this.tick) {
if(b == 0)
sound[i] = tock[t];
else
sound[i] = tick[t];
t++;
} else {
sound[i] = silence;
s++;
if(s >= this.silence) {
t = 0;
s = 0;
b++;
if(b > (this.beat-1))
b = 0;
}
}
}
soundGen.writeSound(sound);
}
return null;
}
受保护的Void doInBackground(Void…params){
calcSilence();
双[]勾号=
soundGen.getSineWave(this.tick,8000,beatSound);
双[]桶=
soundGen.getSineWave(this.tick,8000,sound);
双重沉默=0;
double[]声音=新的double[8000];
int t=0,s=0,b=0;
而(!isCancelled()){
for(int i=0;i(这个节拍-1))
b=0;
}
}
}
soundGen.writeSound(声音);
}
返回null;
}
在异步任务中播放声音时,UI线程不应被锁定。您确定要在背景中播放声音吗?您需要显示一些代码,以便我们能够检测问题。但问题在异步任务中。你需要发布代码。您的do循环应该继续,而(play&&!isCancelled())
应该可以正常工作