Android 使用 Aspectj 限制快速点击
在AspectJ 在 Android 中的使用中,介绍了 Aspectj 的基本知识及其在 Android 中的基本使用,在这篇将会介绍如何使用 Aspectj 在 Android 中限制快速点击
1. 配置依赖
建立 clicklimt 的 lib,添加对 Aspect 的依赖,之前我们要做很多的配置工作,沪江的开源库 gradle_plugin_android_aspectjx 已经帮我们弄了,省了很多工作。
在根项目的 build.gradle 配置
1 | buildscript { |
在 app 工程的 build.gradle 中使用 AspectJX 插件
1 | apply plugin: 'com.android.application' |
在 clicklimt 库的 build.gradle 中添加 aspectj 依赖
1 | dependencies { |
2. 具体的处理
1. 建立 ClickLimit 注解
我们会对整个项目中的点击事件做点击限制,如果不需要限制的方法,可以设置 value = 0 即可, 我们默认设置为 500 毫秒。
1 | ({ElementType.METHOD }) |
2. 选择 Pointcut
我们这里选择 View#setOnClickListener 作为切入点
1 | // View#setOnClickListener |
对 Joint 的处理
1 | private void processJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { |
通过 ViewTag 来存储上次点击的时间,如果上次的点击时间为 0, 说明是第一次点击,则立即执行;
如果有存储上次点击时间,则通过 canClick 方法配对时间,如果是在时间间隔之内,不执行。
3. 对 clicklimit 库的使用
在 app module 的 build.gradle 中添加 clicklimit 库的引用
1 | implementation project(':clicklimit') |
我们一个使用 View#setOnClickListener 方法,一个使用 ButterKnife 绑定的方式
1 | (R.id.btn_click) |
我们对 tvSay 快速点击两次,看到 log
第一次执行了, 第二在时间限制内,return 掉了
我们点击一下 butterknife 绑定的 button,看看 log
我们看到 butterknife 绑定的方法也被限制,但是我们的 Poincut 并没有对它做限制。
在 app/build/intermediates/transforms/ajx/debug 的路径下会生成 jar 包, ajx 这个路径就是使用了 android-aspectjx 生成
我们将 0.jar 文件放到软件 JD-GUI 上面可以看到里面的代码
其实是因为 ButterKnife 会生成一个 ViewBinding 的类,在里面调用了
View#setOnClickListener 方法
很多文章都需要对 butterknife 设置 Pointcut, 其实这完全是没有必要的.