一、概念
防抖(debounce
)和节流(throttle
)都是为了防止短期频繁的相同事件触发导致资源消耗过快的问题,而实际上并不需要对所有的事件进行及时响应。
二、防抖debounce
和节流throttle
的区别
throttle
保证在每个 deltaT 时间内至少执行一次,而debounce
没有这样的保证;体现在实现层面上的区别就是每次事件触发时参考的【时间点】对于debounce
来说是【上一次触发的时间】,并且在延时没有结束时会重置这个延时,而对于throttle
来说是【上一次handler
执行的时间】,并且在延时尚未结束时不会重置延时。
常用的模式是【throttle
+ 开头执行】和【debounce
+ 结尾执行】。
三、应用场景
- 搜索框防抖
- 点击事件防抖
- 防过度刷新
四、示例
4.1 按键节流throttle
fun View.clickDelay(clickAction: (view:View) -> Unit) {
val minTime = 1000L
var lastTime = 0L
this.setOnClickListener {
val tmpTime = System.currentTimeMillis()
if (tmpTime - lastTime > minTime) {
lastTime = tmpTime
clickAction.invoke(this)
}
}
}
4.2 防抖debounce
val handler = Handler(Looper.getMainLooper())
var runnable: Runnable? = null
fun debounceOnMainThread(delayMillis: Long = 1500L, callback: () -> Unit) {
runnable?.let {
handler.removeCallbacks(it)
}
runnable = Runnable {
callback()
}
handler.postDelayed(runnable, delayMillis)
}