取消/停止运行无限代码的异步任务

时间:2014-03-17 15:53:48

标签: java android

我正在尝试使用此处找到的示例类来构建节拍器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; 
}

0 个答案:

没有答案