Попробуйте написать аналог `coroutine` для `handler`, но не работает

Я новичок в coroutines. Итак, теперь я смотрю, как использовать сопрограммы вместо обработчиков

Код обработчика:

fun Handler.repostDelayed(func: Runnable, delay: Long) {
removeCallbacksAndMessages(null)
postDelayed(func, delay)
}

Аналог в сопрограммах

inline fun AppCompatActivity.repostDelayed(crossinline func: () -> Unit, delay: Long) {
    lifecycleScope.cancel()
    lifecycleScope.launch {
        delay(delay)  //debounce timeOut
        func()
    }
}

Но это не работает. Не могли бы вы исправить мое выражение для Coroutines, пожалуйста?


person Serg Burlaka    schedule 21.02.2020    source источник
comment
Вы не можете просто отменить область сопрограммы, а затем надеяться продолжать ее использовать. Вы можете исправить это, отменив конкретное задание вместо этого, но это все равно будет колоритным кодом.   -  person Marko Topolnik    schedule 21.02.2020


Ответы (1)


Итак, я нашел решение здесь. И только что немного изменил:

 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

person Serg Burlaka    schedule 21.02.2020