Cobalah menulis analog `coroutine` untuk `handler`, tetapi tidak berhasil

Saya baru di coroutines. Jadi sekarang saya melihat cara menggunakan coroutine alih-alih penangan

Kode Penangan:

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

Analog di Coroutine

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

Tapi itu tidak berhasil. Bisakah Anda memperbaiki ekspresi saya untuk Coroutine?


person Serg Burlaka    schedule 21.02.2020    source sumber
comment
Anda tidak bisa begitu saja membatalkan cakupan coroutine lalu berharap untuk terus menggunakannya. Anda dapat memperbaikinya dengan membatalkan pekerjaan tertentu, tetapi itu tetap merupakan kode yang tidak senonoh.   -  person Marko Topolnik    schedule 21.02.2020


Jawaban (1)


Jadi, saya telah menemukan solusinya di sini. Dan baru saja memodifikasi sedikit:

 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)
        }
    }
}

penggunaan:

 private val delayFun: String.(Boolean) -> Unit = lifecycleScope.debounce(START_DELAY) {
        if(it){
            print(this)
        }
    }

     //call function
     "Hello world!".delayFun(true)

Keuntungan penggunaan coroutine adalah Anda tidak perlu membatalkan coroutine saat melihat onDesstroy karena coroutine berfungsi secara otomatis! Namun untuk pawangnya harus menelpon removeCallbacksAndMessages onDestroy

person Serg Burlaka    schedule 21.02.2020