如何在Kotlin中杀死协程?



我想用Kotlin为Android创建一个节拍器应用程序。我正在启动点击回放的协程:

playBtn.setOnClickListener {
if (!isPlaying) {
playBtn.setText(R.string.stop)
isPlaying = true
}
else {
isPlaying = false
playBtn.setText(R.string.play)
}
if (isPlaying) {
GlobalScope.launch {
while (isPlaying) {
delay(bpmToMillis)
launch { metro1.start() }
}
}
}
}

它工作得很好,但如果你快速录制"播放"按下按钮,它就会用节拍器的声音启动另一个线程。所以,除了点击"它播放两段或三段,几乎没有延迟。

我尝试移动代码块并使用sleep和TimeUnit,但它不起作用。

我是新手,请不要讨厌我:)

谢谢大家的帮助!你给我指明了正确的方向。

唯一的播放方式是没有bug,如果我添加新的var与null或空协程:

var job: Job? = null
// or
var job: Job = GlobalScope.launch {}

,然后在if语句中赋值:

playBtn.setOnClickListener {
if (!isPlaying) {
playBtn.setText(R.string.stop)
isPlaying = true
}
else {
isPlaying = false
playBtn.setText(R.string.play)
//job cancel here
job?.cancel()
}
if (isPlaying) {
//var assigment here
job = GlobalScope.launch {
while (isPlaying) {
metro1.start()
delay(bpmToMillis)
}
}
}
}

否则工作是不可见的,你真的不能取消它,当你需要的时候,我认为:)

playBtn.setOnClickListener {
if (!isPlaying) {
playBtn.setText(R.string.stop)
isPlaying = true
}
else {
isPlaying = false
playBtn.setText(R.string.play)
}
if (isPlaying) {
// assigned coroutine scope to variable 
var job = GlobalScope.launch {
while (isPlaying) {

if(isActive){
delay(bpmToMillis)
launch { metro1.start() }
}
}
//some condition to cancel the coroutine
job.cancel()
}
}
}

相关内容

  • 没有找到相关文章

最新更新