Android Aspectj 简单实战

第一步 创建注解

@Retention(RetentionPolicy.RUNTIME) //注解保留至运行时
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR}) //声明注解作用在方法上面
public @interface SingleClick {
    /* 点击间隔时间 */
    long value() default 2000;
}

第二步 创建PointCut

@Aspect
public class SingleClickAspect {

    @Pointcut("execution(@com.temp.aaaa.aspectjdemo.SingleClick * *(..))")
    public void methodClick() {
    }// 该方法不会被执行


    @Around("methodClick()")
    public void around(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();
        }
    }
}

第三步 使用

  btn_click.setOnClickListener(new View.OnClickListener() {
            @SingleClick(5000)
            @Override
            public void onClick(View v) {
              Log.i("ccccccccccc","testFastClick");
            }
        });

快速点击工具类

package com.temp.aaaa.aspectjdemo;

import android.os.SystemClock;
import android.view.View;

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 time = SystemClock.elapsedRealtime();
        long timeInterval = Math.abs(time - mLastClickTime);
        if (timeInterval < intervalMillis && viewId == mLastClickViewId) {
            return true;
        } else {
            mLastClickTime = time;
            mLastClickViewId = viewId;
            return false;
        }
    }
}

你可能感兴趣的:(Android Aspectj 简单实战)