Android使用Kotlin实现防抖行为

简介

今天我们要实现一个功能,批量上传,当用户完成某个动作后就记录下操作数据,然后延迟2秒上传,当2秒内有新的上传任务的时候,就取消上个任务,重新开始计时延时上传,这个行为和Js的防抖功能一样,那么Kotlin如何实现呢?

知道高阶函数的我们可以使用高阶函数和闭包来实现,不知道的请自行学习。

实现

/**
 * 消抖行为
 *
 */
fun debounceSuspend(delayMs: Long = 500L, coroutineScope: CoroutineScope, f: suspend CoroutineScope.() -> Unit): () -> Unit {
    var job: Job? = null
    return {
        job?.cancel()
        job = coroutineScope.launch {
            delay(delayMs)
            job = null
            f()
        }
    }
}

/**
 * 主线程的消抖行为
 */
fun  debounceOnMainThread(delayMs: Long = 500L, callback: (T) -> Unit): (T) -> Unit {
    val handle = Handler(Looper.getMainLooper())
    var runnable: Runnable? = null
    return {t->
        runnable?.let {
            handle.removeCallbacks(it)
        }
        runnable = Runnable {
            callback(t)
        }
        handle.postDelayed(runnable, delayMs)
    }
}

可以看到,异步和主线程的防抖实现都是返回一个匿名函数,外部每次调用匿名函数的时候,都会先取消上次的行为,然后延迟一段时间,执行任务。
调用方式如下

private val debounceWifiChanged = debounceOnMainThread(5000) {
        onWifiConnectedChange(it)
    }

当高层监听到变化都调用一次debounceWifiChanged函数。

你可能感兴趣的:(Android使用Kotlin实现防抖行为)