创建线程来运行一段代码?

时间:2018-09-24 17:19:01

标签: android multithreading

我是android开发的新手,我想创建一个按钮来启动节奏拍子(如节拍器)并在再次单击时停止(一个按钮用于启动和停止)。

当我单击该按钮时,它会在一秒钟的延迟中依次播放5个声音,然后重复播放这5个声音,直到再次按下该按钮为止。

我的问题是,直到播放完所有5种声音为止,整个系统都处于“锁定”状态(不能增大或减小音量,只有在5种声音结束后才可以使用停止按钮)。

所以我想创建一个线程来运行5种声音,当我再次按下按钮时,我希望该线程立即停止。我尝试没有成功,所以任何帮助都会很棒。

这是onClick方法:

public boolean tempoOn = false; // global

public void clickHandlerStartTempo(View view) {
    if (!tempoOn) {
        Toast toast = Toast.makeText(getApplicationContext(), "Start Tempo!", Toast.LENGTH_SHORT);
        toast.show();
        tempoOn = true;
        final Handler handler = new Handler();
        final int delay = 1000; //milliseconds

        handler.postDelayed(new Runnable(){
            public void run(){
                if (tempoOn) {
                    playSound(0);
                    SystemClock.sleep(1000);
                    playSound(1);
                    SystemClock.sleep(1000);
                    playSound(1);
                    SystemClock.sleep(1000);
                    playSound(1);
                    SystemClock.sleep(1000);
                    playSound(1);
                    handler.postDelayed(this, delay);
                }
            }
        }, delay);
    } else {
        Toast toast = Toast.makeText(getApplicationContext(), "Stop Tempo!", Toast.LENGTH_SHORT);
        toast.show();
        tempoOn = false;
    }

}

playSound方法(我正在使用SoundPool):

public void playSound(int fileNumber) {
    sounds.play(soundIds.get(fileNumber), 1f, 1f, 1, 0, 1);
}

非常感谢。

1 个答案:

答案 0 :(得分:0)

您需要将媒体播放器作为服务运行以在后台运行。尝试查看https://developer.android.com/guide/topics/media/mediaplayer#java“在服务中使用MediaPlayer”