学无先后,达者为师

网站首页 编程语言 正文

Android 防重复点击(Kotlin 协程实现 和 Handler实现)

作者:匆忙拥挤repeat 更新时间: 2022-07-18 编程语言

文章目录

  • Kotlin 协程实现
    • 调用
  • Handler + Runnable 实现
    • 调用
  • 基于系统时间 实现
    • 调用
  • setTag/getTag 可能引发异常

考虑了,直接绑定 View#setOnClickListener 实现函数;或传入View.OnClickListener 实例。

Kotlin 协程实现

在这里插入图片描述

调用

mBind.btnJaClickA.debounceClick(lifecycleScope) { }
mBind.btnJaClickB.debounceClick(this) { }
mBind.btnJaClickC.debounceClick(lifecycleScope, originBlock = { })
mBind.btnJaClickD.debounceClick(this, originBlock = { })

本实现,会后触发真实事件,连续点击时,看到的日志是这样的:

start
start
start
...
end

Handler + Runnable 实现

在这里插入图片描述

除了构建一个全局的 handler 对象; 或可以直接使用 View内的handler实例。
eg. this.handler.postDelayed()

调用

mBind.btnJaClickD.debounceClickWidthHandler { }
mBind.btnJaClickE.debounceClickWidthHandler(originBlock = { })

本实现,会后触发真实事件,连续点击时,看到的日志是这样的:

start
start  remove
start  remove
...
end

基于系统时间 实现

在这里插入图片描述

调用

mBind.btnJaClickG.clickWithTrigger { }
mBind.btnJaClickH.clickWithTrigger(originBlock = { })

本实现,会先触发真实事件,连续点击时,看到的日志是这样的:

start
end
start 
start 
...

setTag/getTag 可能引发异常

使用uuid-string,并获取 其hashCode,作为tag的key值;或者使用一个固定的int值作为key值;可能会报异常:IllegalArgumentException: The key must be an application-specific resource id;
看这个异常说明,就是需要定义特定的 资源id ,来用作 setTag/getTag的key。

ids.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="job_id"/>
    <item type="id" name="runnable_id"/>
    <item type="id" name="trigger_last_time_id"/>
</resources>

应用:
setTag(R.id.job_id, obj)
getTag(R.id.job_id, obj)

原文链接:https://blog.csdn.net/jjwwmlp456/article/details/124897867

栏目分类
最近更新