欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

AOP在Android中的使用(防止快速点击)

程序员文章站 2022-03-03 22:14:25
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

相关标签: android相关