簡體   English   中英

如何在 Kotlin 中殺死協程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM