当前位置: 首页 > news >正文

Android 防抖和节流

文章目录

  • Android 防抖和节流
    • 概述
    • 工具类
    • 使用
    • 源码下载

Android 防抖和节流

概述

  • 防抖(Debounce):
    • 防抖是指在事件被触发后,等待一段时间,如果在这段时间内没有再触发事件,才执行处理函数。如果在这段时间内又触发了事件,就重新开始计时。
    • 场景:适用于频繁触发的事件,如:输入框搜索。
  • 节流(Throttle):
    • 节流是指在一定时间间隔内,无论事件触发多少次,只执行一次处理函数。
    • 场景:适用于限制频率的操作,如:提交按钮。

工具类

object DebounceThrottleUtils {
    private val handler = Handler(Looper.getMainLooper())
    private val debounceMap = ConcurrentHashMap<String, Runnable>()
    private val throttleMap = ConcurrentHashMap<String, Long>()

    /**
     * 防抖
     *  @param key 唯一标识符(建议使用View ID)
     *  @param delayMillis 防抖时间间隔(毫秒)
     *  @param block 要执行的操作
     */
    fun debounce(key: String, delayMillis: Long, block: () -> Unit) {
        // 移除之前的任务
        debounceMap[key]?.let {
            handler.removeCallbacks(it)
            debounceMap.remove(key)
        }
        // 创建新任务
        val runnable = Runnable {
            block()
        }
        debounceMap.put(key, runnable)
        // 延迟执行任务
        handler.postDelayed(runnable, delayMillis)
    }

    /**
     * 节流处理
     * @param key 唯一标识符(建议使用View ID)
     * @param intervalMillis 节流时间间隔(毫秒)
     * @param block 要执行的操作
     */
    fun throttle(key: String, intervalMillis: Long, block: () -> Unit) {
        val now = System.currentTimeMillis()
        val lastTime = throttleMap[key] ?: 0
        if (now - lastTime >= intervalMillis) {
            throttleMap[key] = now
            block()
        }
    }

    /**
     * 清理指定(在onDestroy中调用)
     */
    fun clear(key: String) {
        debounceMap[key]?.let {
            handler.removeCallbacks(it)
            debounceMap.remove(key)
        }
        throttleMap.remove(key)
    }

    /**
     * 清理全部(在onDestroy中调用)
     */
    fun clearAll() {
        handler.removeCallbacksAndMessages(null)
        debounceMap.clear()
        throttleMap.clear()
    }
}

/**
 * 获取View的key
 */
fun View.getKey(): String {
    return "click_${this.id}"
}

/**
 * 获取EditText的key
 */
fun EditText.getKey(): String {
    return "text_change_${this.id}"
}

/**
 * 防抖扩展方法
 */
fun View.clickDebounce(debounceTime: Long = 500L, action: () -> Unit) {
    val key = getKey()
    setOnClickListener {
        DebounceThrottleUtils.debounce(key, debounceTime, action)
    }
}

/**
 * 节流扩展方法
 */
fun View.clickThrottle(throttleTime: Long = 300L, action: () -> Unit) {
    val key = getKey()
    setOnClickListener {
        DebounceThrottleUtils.throttle(key, throttleTime, action)
    }
}

/**
 * 防抖扩展方法
 */
fun EditText.textChangeDebounce(debounceTime: Long = 300L, action: (Editable?) -> Unit) {
    doAfterTextChanged { editable ->
        val key = getKey()
        DebounceThrottleUtils.debounce(key, debounceTime, {
            action(editable)
        })
    }
}

使用

etSearch.textChangeDebounce(debounceTime = 1000L) {
    Log.e("TAG", "textChange:${it.toString()}")
}
btnSubmit.clickDebounce(debounceTime = 1000L) {
    Log.e("TAG", "click-debounce-${System.currentTimeMillis()}")
}
btnSubmit2.clickThrottle(throttleTime = 1000L) {
    Log.e("TAG", "click-throttle-${System.currentTimeMillis()}")
}

源码下载

http://www.dtcms.com/a/106752.html

相关文章:

  • 【Kafka基础】Kafka工作原理解析
  • 英语口语 -- 常用 1368 词汇
  • 206. 反转链表 92. 反转链表 II 25. K 个一组翻转链表
  • 店铺状态设置-03.功能测试
  • Kotlin问题汇总
  • AI:机器学习-线性回归
  • 边缘计算赋能淘宝API:分布式节点缓存降低高并发延迟
  • 风电行业预测性维护解决方案:AIoT驱动下的风机健康管理革命
  • 多模态RAG实践:如何高效对齐不同模态的Embedding空间?
  • arcgis10.8 Toolbox中的conversion tools没有to coverage工具?
  • 4. 理解Prompt Engineering:如何让模型听懂你的需求
  • 【Kafka基础】基础概念解析与消息队列对比
  • Redis如何在windows中简单安装?
  • 线性DP总结
  • Centos 8 安装教程(新手版)
  • element-ui自制树形穿梭框
  • python操作es
  • 机器学习的一百个概念(8)插补法
  • LeetCode hot 100—最长递增子序列
  • PyQt5界面设计
  • 现代几何风格网页标牌标识logo海报标题设计psai英文字体安装包 Myfonts – Gilroy Font Family
  • React安装使用教程
  • vue3源码分析 -- runtime
  • ES6中增强对象
  • 虚幻引擎控制角色跟随移动方向旋转的方法
  • NLP高频面试题(三十二)——介绍一下CLIP和CLIP2
  • 【WebGL】getContext参数详解
  • 黑马 C++ 学习笔记
  • 红包-算法
  • HTB - Cat记录