Итак, я нашел решение здесь . И только что немного изменил:
fun <T, V> CoroutineScope.debounce(
waitMs: Long = 300L,
destinationFunction: T.(V) -> Unit
): T.(V) -> Unit {
var debounceJob: Job? = null
return { param: V ->
debounceJob?.cancel()
debounceJob = launch {
delay(waitMs)
destinationFunction(param)
}
}
}
использование:
private val delayFun: String.(Boolean) -> Unit = lifecycleScope.debounce(START_DELAY) {
if(it){
print(this)
}
}
//call function
"Hello world!".delayFun(true)
Преимущество использования сопрограммы заключается в том, что вам не нужно отменять сопрограмму при просмотре onDesstroy
, потому что она работает автоматически ! Но для обработчика, вы должны позвонить removeCallbacksAndMessages
onDestroy