[英]How to kill a coroutine in Kotlin?
我想用 Kotlin for 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,但它不起作用。
我是菜鳥,不討厭請:)
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()
}
}
}
謝謝大家的幫助! 你把我推向了正確的方向。
如果我添加帶有 null 或空協程的新 var,播放不會被竊聽的唯一方式:
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)
}
}
}
}
否則工作在上層是不可見的,你不能在需要的時候真正取消它,我認為:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.