简介
今天我们要实现一个功能,批量上传,当用户完成某个动作后就记录下操作数据,然后延迟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 <T> 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<Boolean>(5000) {
onWifiConnectedChange(it)
}
当高层监听到变化都调用一次debounceWifiChanged函数。