79 lines
2.0 KiB
Kotlin
79 lines
2.0 KiB
Kotlin
package com.aiosman.ravenow.utils
|
||
|
||
import kotlinx.coroutines.CoroutineScope
|
||
import kotlinx.coroutines.delay
|
||
import kotlinx.coroutines.launch
|
||
import java.util.concurrent.atomic.AtomicBoolean
|
||
|
||
/**
|
||
* 防抖工具类
|
||
* 用于防止用户快速重复点击
|
||
*/
|
||
object DebounceUtils {
|
||
|
||
/**
|
||
* 防抖点击处理
|
||
* @param scope 协程作用域
|
||
* @param delayMillis 防抖延迟时间(毫秒),默认500ms
|
||
* @param action 要执行的操作
|
||
*/
|
||
fun debounceClick(
|
||
scope: CoroutineScope,
|
||
delayMillis: Long = 500L,
|
||
action: () -> Unit
|
||
) {
|
||
scope.launch {
|
||
delay(delayMillis)
|
||
action()
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 带状态检查的防抖点击处理
|
||
* @param scope 协程作用域
|
||
* @param delayMillis 防抖延迟时间(毫秒),默认500ms
|
||
* @param isProcessing 是否正在处理中的状态
|
||
* @param action 要执行的操作
|
||
*/
|
||
fun debounceClickWithState(
|
||
scope: CoroutineScope,
|
||
delayMillis: Long = 500L,
|
||
isProcessing: AtomicBoolean,
|
||
action: () -> Unit
|
||
) {
|
||
if (isProcessing.get()) {
|
||
return
|
||
}
|
||
|
||
isProcessing.set(true)
|
||
scope.launch {
|
||
delay(delayMillis)
|
||
try {
|
||
action()
|
||
} finally {
|
||
isProcessing.set(false)
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 简单的防抖点击处理(无协程)
|
||
* @param lastClickTime 上次点击时间
|
||
* @param delayMillis 防抖延迟时间(毫秒),默认500ms
|
||
* @param action 要执行的操作
|
||
* @return 是否执行了操作
|
||
*/
|
||
fun simpleDebounceClick(
|
||
lastClickTime: Long,
|
||
delayMillis: Long = 500L,
|
||
action: () -> Unit
|
||
): Boolean {
|
||
val currentTime = System.currentTimeMillis()
|
||
if (currentTime - lastClickTime < delayMillis) {
|
||
return false
|
||
}
|
||
action()
|
||
return true
|
||
}
|
||
}
|