Android 处理 View 重复点击的多种方法
作者:louisgeek 发布时间:2022-03-05 17:10:03
标签:Android,view,重复点击
1、抽象类
//实现 View.OnClickListener 接口
public abstract class OnThrottleClickListener implements View.OnClickListener {
private static final String TAG = "OnThrottleClickListener";
private static final int SKIP_DURATION = 300;//milliseconds
private long mLastClickTime;
@Override
public void onClick(View v) {
if (System.currentTimeMillis() - mLastClickTime > SKIP_DURATION) {
onThrottleClick(v);
mLastClickTime = System.currentTimeMillis();
} else {
Log.e(TAG, "OnThrottleClickListener: 重复点击");
}
}
protected abstract void onThrottleClick(View v);
}
//代替 new View.OnClickListener() 使用
id_tv_1.setOnClickListener(new OnThrottleClickListener() {
@Override
protected void onThrottleClick(View v) {
Log.e(TAG, "onClick: OnThrottleClickListener ");
}
});
2、代理模式
//代理类实现 View.OnClickListener 接口
public class ThrottleClickProxy implements View.OnClickListener {
private static final String TAG = "ThrottleClickProxy";
private static final int SKIP_DURATION = 300;//milliseconds
private long mLastClickTime;
//源对象
private View.OnClickListener mOriginListener;
//构造
public ThrottleClickProxy(View.OnClickListener mOriginListener) {
this.mOriginListener = mOriginListener;
}
@Override
public void onClick(View v) {
if (System.currentTimeMillis() - mLastClickTime >= SKIP_DURATION) {
mOriginListener.onClick(v);
mLastClickTime = System.currentTimeMillis();
} else {
Log.e(TAG, "ThrottleClickProxy: 重复点击");
}
}
}
//使用
id_tv_2.setOnClickListener(new ThrottleClickProxy(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e(TAG, "onClick: ThrottleClickProxy ");
}
}));
3、RxAndroid 之 RxBinding
implementation 'com.jakewharton.rxbinding3:rxbinding:3.0.0-alpha1'
RxView.clicks(id_tv_3)
.throttleFirst(300, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Unit>() {
@Override
public void accept(Unit unit) throws Exception {
Log.e(TAG, "onClick: throttleFirst ");
}
});
4、AOP 之 Eclipse AspectJ
//采用 AspectJX 来快速配置 Eclipse AspectJ
//project
dependencies {
classpath "com.android.tools.build:gradle:4.1.2"
//add
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}
plugins {
id 'com.android.application'
//add
id 'android-aspectjx'
}
//module
dependencies {
//add
implementation 'org.aspectj:aspectjrt:1.9.5'
}
@Aspect
public class ThrottleClickAspect {
private static final String TAG = "ThrottleClickAspect";
private static final int SKIP_DURATION = 3000;
private long mLastClickTime;
//所有的 android.view.View.OnClickListener.onClick 方法都会被织入,像第三方组件 RxView.clicks() 里也会
@Around("execution(* android.view.View.OnClickListener.onClick(..))")
public void aroundViewOnClick(ProceedingJoinPoint joinPoint) throws Throwable {
if (System.currentTimeMillis() - mLastClickTime >= SKIP_DURATION) {
joinPoint.proceed();
mLastClickTime = System.currentTimeMillis();
} else {
Log.e(TAG, "ThrottleClickAspect: 重复点击");
}
}
}
代码无侵入方式,直接生效了
来源:https://juejin.cn/post/6940880628611022856


猜你喜欢
- 本文实例讲述了C#实现的WINDOWS登录功能。分享给大家供大家参考,具体如下:using System;using System.Data
- Sentinel 是什么随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统
- 1.利用 “+”(加号)运算符:string str = “Hello”+ “World”; console.WriteLine(str);
- 用途项目中使用了 dubbo,注册中心使用的 zookeeper,使用 zookeeper 实现了一个简单的分布式锁(依赖 curator)
- 前言C# 语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。同时,C# 每个版本的发布都与同
- 本文实例为大家分享了Java实现 * 系统的具体代码,供大家参考,具体内容如下父类Vehiclepublic abstract class
- Android 使用FragmentTabhost代替Tabhost前言:现在Fragment使用越来越广了,虽然Fragment寄生在Ac
- FileStream,顾名思义,文件流。流,是字节流。我的理解是,硬盘上存在一个字节流,内存里也有一个字节流,它们是对应的。程序运行时,我们
- 传统的单例写法解决了什么问题首先,在大多数情况下(不包含面试),传统的单例写法已经完全够用了。通过 synchronized 关键字解决了多
- 前言大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研、笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点
- Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)用户线程即运行在前台的线程,而守护线程是运行
- 前言Snackbar和Toast相似,都是为了给用户提供交互信息,Snackbar是固定在底部的,显示时从下往上滑出要使用Snackbar,
- * 验证码地址:https://007.qq.com/online.html* 使用OpenCv模板匹配* 成功率90%左右* Java +
- 本文实例为大家分享了Java实现简单万年历的具体代码,供大家参考,具体内容如下1 要求1、输入年份;2、输入月份;3、输出某年某月的日历。2
- 枚举的基本用法回顾以下是一个常见的 C# 枚举(enum)的示例:enum Weekday{
- 本文实例讲述了Android编程实现图片的浏览、缩放、拖动和自动居中效果的方法。分享给大家供大家参考,具体如下:Touch.java/**
- 本文实现初次设置密码验证过程,首先实现如下效果布局如下:<?xml version="1.0" encoding=
- java 设计模式之单例模式前言:在软件开发过程中常会有一些对象我们只需要一个,如:线程池(threadpool)、缓存(cac
- 本文实例讲述了Java编程中文件读写的方法。分享给大家供大家参考,具体如下:Java中文件读写操作的作用是什么?回答这个问题时应该先想到的是
- 一般在android显示一个View都是通过Activity的setContentView设置的,但是还有一种方法,可以直接使用Window