AOP在Android中的使用(防止快速点击)
程序员文章站
2022-06-21 19:51:06
1.根目录的build.gradle添加如下代码 dependencies { classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8' }2.app目录下的build.gradle添加如下代码apply plugin: 'android-aspectjx'aspectjx { exclude 'androidx','com.google','com.squareup','com.a...
1.根目录的build.gradle添加如下代码
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8'
}
2.app目录下的build.gradle添加如下代码
apply plugin: 'android-aspectjx'
aspectjx {
exclude 'androidx','com.google','com.squareup','com.alipay','org.apache'
enabled true
}
dependencies {
implementation 'org.aspectj:aspectjrt:1.9.5'
}
3.防止多次点击代码
/**
* 在需要定制时间间隔地方添加@FastClick注解
* 如果使用了混淆,注意被切点注解标识的类与方法一定要keep住
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface FastClick {
long value() default FastClickAspect.FAST_CLICK_INTERVAL_GLOBAL;
}
/**
* @author chenli
* @create 2020/9/8
* @Describe
*/
@Aspect
public class FastClickAspect {
public static final long FAST_CLICK_INTERVAL_GLOBAL = 800L;
@Pointcut("execution(void android.view.View.OnClickListener.onClick(..))")
public void methodViewOnClick() {
}
@Around("methodViewOnClick()")
public void aroundViewOnClick(ProceedingJoinPoint joinPoint) throws Throwable {
// 取出JoinPoint的签名
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
// 取出JoinPoint的方法
Method method = methodSignature.getMethod();
// 1. 全局统一的时间间隔
long interval = FAST_CLICK_INTERVAL_GLOBAL;
if (method != null && method.isAnnotationPresent(FastClick.class)) {
// 2. 如果方法使用了@FastClick修饰,取出定制的时间间隔
FastClick singleClick = method.getAnnotation(FastClick.class);
interval = singleClick.value();
}
// 取出目标对象
View target = (View) joinPoint.getArgs()[0];
// 3. 根据点击间隔是否超过interval,判断是否为快速点击
// 根据点击间隔是否超过FAST_CLICK_INTERVAL_GLOBAL,判断是否为快速点击
if (!FastClickCheckUtil.isFastClick(target, interval)) {
joinPoint.proceed();
}
}
}
/**
* @author chenli
* @create 2020/9/8
* @Describe
*/
public class FastClickCheckUtil {
/**
* 判断是否属于快速点击
*
* @param view 点击的View
* @param interval 快速点击的阈值
* @return true:快速点击
*/
public static boolean isFastClick(@NonNull View view, long interval) {
int key = R.id.view_click_time;
// 最近的点击时间
long currentClickTime = System.currentTimeMillis();
if(null == view.getTag(key)){
// 1. 第一次点击
// 保存最近点击时间
view.setTag(key, currentClickTime);
return false;
}
// 2. 非第一次点击
// 上次点击时间
long lastClickTime = (long) view.getTag(key);
if(currentClickTime - lastClickTime < interval){
// 未超过时间间隔,视为快速点击
return true;
}else{
// 保存最近点击时间
view.setTag(key, currentClickTime);
return false;
}
}
}
混淆代码(记得要做相应的修改)
-keep,allowobfuscation interface cn.isccn.ouyu.click.FastClick
-keep @cn.isccn.ouyu.click.FastClick class *
-keep @cn.isccn.ouyu.click.* class * {*;}
-keep @cn.isccn.ouyu.click.FastClick class *
-keepclassmembers class * {
@cn.isccn.ouyu.click.FastClick *;
}
-keep class * {
@cn.isccn.ouyu.click.FastClick * ;
}
本文地址:https://blog.csdn.net/chenli_001/article/details/108581769