AOP实现FastClick判断

相信我们遇到过短时间内多次点击的问题,解决该问题有很多方式,这里提供一种AOP实现的方式,主要使用一下aspectj

先说一个坑,使用AOP一定记得要ReBuild项目,ReBuild项目,ReBuild项目,实在不行放大招,卸载app后再ReBuild

先引入aspectj

//在Project中
  dependencies {
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
    }

//在app中
apply plugin: 'android-aspectjx'    //插件
implementation 'org.aspectj:aspectjrt:1.8.+'   //jar

上代码

  1. 定义注解,在IOC框架的时候使用过
@Target(ElementType.METHOD) // Target 放在哪个位置
@Retention(RetentionPolicy.RUNTIME)// RUNTIME 运行时 xUtils  CLASS 代表编译时期 ButterKnife   SOURCE 代表资源
public @interface FastClick {
}
  1. 核心类
@Aspect
public class FastClickAspect {

    /**
     * 这里是注解的全名
     */
    @Pointcut("execution(@com.justin.testaop.aop.FastClick * *(..))")
    public void fastClickBehavior(){

    }
    @Around("fastClickBehavior()")
    public Object fastClick(ProceedingJoinPoint joinPoint) throws Throwable {
        Log.e("TAG", "fastClick");
       
        MethodSignature methodSignature =
                (MethodSignature) joinPoint.getSignature();
        //有说这个方法是获取代理对象(接口)方法的注解
        FastClick fastClick = methodSignature.getMethod().getAnnotation(FastClick.class);

        //有说这个方法才是获取目标方法的注解
//        Method realMethod = joinPoint.getTarget().getClass().getMethod(methodSignature.getName(),
//                methodSignature.getParameterTypes());
//        FastClick fastClick = realMethod.getAnnotation(FastClick.class);

        Log.e("fastClick",fastClick == null?"null":"notnull");
        if (fastClick != null){
            if (Utils.isFastClick()){
                return null;
            }
        }
        return joinPoint.proceed();

    }
}

上面第一个方法,有说是获取代理对象(接口)方法的注解,说第二个方法才是获取目标对象方法的,我目前使用第一个方法也能获取到目标对象方法上的注解,所以目前没遇到无法获取的情况.

  1. 其中Utils
public class Utils {

    private static long lastTime = 0;
    private static final long MINI_TIME = 1000;

    public static boolean isFastClick(){
        boolean flag = false;
        long currentTimeMillis = System.currentTimeMillis();
        if (currentTimeMillis-lastTime<MINI_TIME){
            flag = true;
        }
        lastTime = currentTimeMillis;
        return flag;
    }

}
  1. 使用
    @FastClick
    @Override
    public void onClick(View v) {
        Toast.makeText(this, "not fast", Toast.LENGTH_SHORT).show();
    }

其实对AOP我们并不陌生,动态代理也是AOP的一种实现,可以参考文章代理模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。