我正在尝试使用此处找到的示例类来构建节拍器http://masterex.github.io/archive/2012/05/28/android-audio-synthesis.html
我已经建立了一个带有几个按钮的活动,然后停止节拍器。 play()方法(生成,保存和播放样本)在布尔值play上使用do {}(while),在调用stop()方法时应该设置为false。
最初,我发现UI卡住了播放,所以决定在asynchtask中运行play()方法,但是我仍然遇到阻止它的问题。我在这里查找了一个类似的问题,Is it possible to stop asynctask while doInBackground running?并尝试调整while循环以检查isCancelled,同时在stop()方法(以及停止按钮监听器)中调用cancel()但仍然没有快乐。
我不知道这个解决方案是如何工作的,因为解决方案中的循环或节拍器的播放()都不允许doinbackground返回任何内容
"调用此方法(cancel())将导致在doInBackground(Object [])返回后在UI线程上调用onCancelled(Object)。 "
任何想法如何更好地实现,以允许执行play()以按下按钮来运行和停止。
我的runinbackground,scooped play()的内容并把它放在这里,在我的活动线程中我创建一个节拍器m,然后调用m.execute启动,m.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;
}