Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取消/停止运行无限代码的asynchtask_Java_Android - Fatal编程技术网

Java 取消/停止运行无限代码的asynchtask

Java 取消/停止运行无限代码的asynchtask,java,android,Java,Android,我正在尝试使用这里找到的示例类构建metronome 我建立了一个活动,有两个按钮来启动和停止节拍器。 play()方法(生成、保存和播放示例)在布尔值play上使用do{}(while),调用stop()方法时应将其设置为false 起初,我发现按play键时UI被卡住了,所以决定在asynchtask中运行play()方法,但在停止时仍然有问题。我在这里查找了一个类似的问题,并尝试调整while循环以检查isCancelled,同时在stop()方法(和stop按钮侦听器)中调用cancel

我正在尝试使用这里找到的示例类构建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停止

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())
应该可以正常工作