Android(安卓)防止按钮重复点击
16lz
2021-01-26
原文链接: https://www.jianshu.com/p/7b354eb8d0d3
如何使用AOP来解决重复点击问题?
感谢这个吊毛:https://www.jianshu.com/p/7b354eb8d0d3
1.引入Aspectj
Android 上使用AOP编程,一般使用Aspectj这个库
站在巨人的肩膀上,沪江已经开源了Aspectj的Gradle插件,方便我们使用Aspectj
在项目根目录下的build.gradle中,添加依赖:
dependencies { ...... classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'}
在app或其他module目录下的build.gradle中,添加:
// 注意:主App中请确保添加aspectjx(不能漏了)apply plugin: 'android-aspectjx'dependencies { ...... implementation 'org.aspectj:aspectjrt:1.8.9'}
2.添加一个自定义注解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SingleClick { /* 点击间隔时间 */ long value() default 1000;}
添加自定义注解的原因是,方便管理哪些方法使用了重复点击的AOP,同时可以在注解中传入点击时间间隔,更加灵活。
3.封装一个重复点击判断工具类
public final class XClickUtil {/** * 最近一次点击的时间 */private static long mLastClickTime;/** * 最近一次点击的控件ID */private static int mLastClickViewId;/** * 是否是快速点击 * * @param v 点击的控件 * @param intervalMillis 时间间期(毫秒) * @return true:是,false:不是 */public static boolean isFastDoubleClick(View v, long intervalMillis) { int viewId = v.getId(); long time = System.currentTimeMillis(); long timeInterval = Math.abs(time - mLastClickTime); if (timeInterval < intervalMillis && viewId == mLastClickViewId) { return true; } else { mLastClickTime = time; mLastClickViewId = viewId; return false; }}}
4.编写Aspect AOP处理类
定义切点,标记切点为所有被@SingleClick注解的方法
* 注意 **
这里me.baron.test.annotation.SingleClick需要替换成
你自己项目中SingleClick这个类的全路径哦
@Aspectpublic class SingleClickAspect { private static final long DEFAULT_TIME_INTERVAL = 5000;/** * 定义切点,标记切点为所有被@SingleClick注解的方法 注意:这里me.baron.test.annotation.SingleClick需要替换成 * 你自己项目中SingleClick这个类的全路径哦 */@Pointcut("execution(@me.baron.test.annotation.SingleClick * *(..))")public void methodAnnotated() {}/** * 定义一个切面方法,包裹切点方法 */@Around("methodAnnotated()")public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { // 取出方法的参数 View view = null; for (Object arg : joinPoint.getArgs()) { if (arg instanceof View) { view = (View) arg; break; } } if (view == null) { return; } // 取出方法的注解 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); if (!method.isAnnotationPresent(SingleClick.class)) { return; } SingleClick singleClick = method.getAnnotation(SingleClick.class); // 判断是否快速点击 if (!XClickUtil.isFastDoubleClick(view, singleClick.value())) { // 不是快速点击,执行原方法 joinPoint.proceed(); }}
}
使用方法
private void initView() { btTest = findViewById(R.id.bt_test); btTest.setOnClickListener(new View.OnClickListener() { // 如果需要自定义点击时间间隔,自行传入毫秒值即可 // @SingleClick(2000) @SingleClick @Override public void onClick(View v) { // do something } });}
感谢这个吊毛(大神):https://www.jianshu.com/p/7b354eb8d0d3
我的个人demo:AntiOnclick
更多相关文章
- 下载安装eclipse ADT插件:
- Android系统自带更新DownloadManager用法
- Android(安卓)Unable to resolve target 'android-X'
- android mvp快速开发框架介绍(继续dileber)
- Android(安卓)listview子控件的的点击事件
- [Android] ButterKnifeProcessor 工作流程分析
- Android(安卓)studio怎么使用eclipse的快捷键?
- [置顶] Android:实现仿 美团/淘宝 多级分类菜单效果
- Android之给ImageView添加点击效果