原文链接: https://www.jianshu.com/p/7b354eb8d0d3

如何使用AOP来解决重复点击问题?

感谢这个吊毛:https://www.jianshu.com/p/7b354eb8d0d3

1.引入Aspectj

Android 上使用AOP编程,一般使用Aspectj这个库
站在巨人的肩膀上,沪江已经开源了Aspectj的Gradle插件,方便我们使用Aspectj

在项目根目录下的build.gradle中,添加依赖:

dependencies {     ......     classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'}

在app或其他module目录下的build.gradle中,添加:

// 注意:主App中请确保添加aspectjx(不能漏了)apply plugin: 'android-aspectjx'dependencies {    ......    implementation 'org.aspectj:aspectjrt:1.8.9'}

2.添加一个自定义注解

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface SingleClick {    /* 点击间隔时间 */    long value() default 1000;}

添加自定义注解的原因是,方便管理哪些方法使用了重复点击的AOP,同时可以在注解中传入点击时间间隔,更加灵活。

3.封装一个重复点击判断工具类

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

4.编写Aspect AOP处理类

定义切点,标记切点为所有被@SingleClick注解的方法

* 注意 **

这里me.baron.test.annotation.SingleClick需要替换成

你自己项目中SingleClick这个类的全路径哦

@Aspectpublic class SingleClickAspect {    private static final long DEFAULT_TIME_INTERVAL = 5000;/**  * 定义切点,标记切点为所有被@SingleClick注解的方法  注意:这里me.baron.test.annotation.SingleClick需要替换成 * 你自己项目中SingleClick这个类的全路径哦 */@Pointcut("execution(@me.baron.test.annotation.SingleClick * *(..))")public void methodAnnotated() {}/**  * 定义一个切面方法,包裹切点方法 */@Around("methodAnnotated()")public void aroundJoinPoint(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();    }}

}

使用方法

private void initView() {    btTest = findViewById(R.id.bt_test);    btTest.setOnClickListener(new View.OnClickListener() {        // 如果需要自定义点击时间间隔,自行传入毫秒值即可        // @SingleClick(2000)        @SingleClick        @Override        public void onClick(View v) {            // do something        }    });}
感谢这个吊毛(大神):https://www.jianshu.com/p/7b354eb8d0d3

我的个人demo:AntiOnclick

更多相关文章

  1. 下载安装eclipse ADT插件:
  2. Android系统自带更新DownloadManager用法
  3. Android(安卓)Unable to resolve target 'android-X'
  4. android mvp快速开发框架介绍(继续dileber)
  5. Android(安卓)listview子控件的的点击事件
  6. [Android] ButterKnifeProcessor 工作流程分析
  7. Android(安卓)studio怎么使用eclipse的快捷键?
  8. [置顶] Android:实现仿 美团/淘宝 多级分类菜单效果
  9. Android之给ImageView添加点击效果

随机推荐

  1. Android 定时/倒计时工具 - 加强版 CountD
  2. eclipse上Android NDK开发环境搭建
  3. Android(安卓)获取年月日时分秒 格式化指
  4. Android 他人面试题总结
  5. android 城市列表
  6. Android中的开机和关机广播
  7. android运行后台服务de生命周期yu使用技
  8. Android(安卓)O上获取Adaptive Icon的Bit
  9. eclipse无法导入Android工程的解决办法
  10. android service 学习(上)