笔记:AOP实现Android防重复点击
1.在项目根目录的build.gradle里依赖AspectJX
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2.在app项目的build.gradle里应用插件
apply plugin: 'android-aspectjx'
3.在app项目的build.gradle里进行AspectJX配置
android {
// AOP 配置
aspectjx {
// 排除一些第三方库的包名(Gson、 LeakCanary 和 AOP 有冲突)
// 否则就会起冲突:ClassNotFoundException: Didn't find class on path: DexPathList
exclude 'androidx', 'com.google', 'com.squareup', 'com.alipay', 'com.taobao', 'org.apache'
}
}
4.编写注解代码
package com.test.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* author : Android 轮子哥
* github : https://github.com/getActivity/AndroidProject
* time : 2019/12/06
* desc : 防重复点击注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SingleClick {
/**
* 快速点击的间隔
*/
long value() default 1000;
}
5.注意切入点处包名位置改为自己的SingleClick类位置
package com.test.aop;
import android.util.Log;
import android.view.View;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import java.util.Calendar;
/**
* author : Android 轮子哥
* github : https://github.com/getActivity/AndroidProject
* time : 2019/12/06
* desc : 防重复点击处理
*/
@Aspect
public class SingleClickAspect {
/**
* 最近一次点击的时间
*/
private long mLastTime;
/**
* 最近一次点击的控件ID
*/
private int mLastId;
/**
* 方法切入点
*/
@Pointcut("execution(@com.test.aop.SingleClick * *(..))")
public void method() {}
/**
* 在连接点进行方法替换
*/
@Around("method() && @annotation(singleClick)")
public void aroundJoinPoint(ProceedingJoinPoint joinPoint, SingleClick singleClick) throws Throwable {
View view = null;
for (Object arg : joinPoint.getArgs()) {
if (arg instanceof View) {
view = (View) arg;
}
}
if (view != null) {
long currentTime = Calendar.getInstance().getTimeInMillis();
if (currentTime - mLastTime < singleClick.value() && view.getId()
== mLastId) {
Log.i("SingleClick", "发生快速点击");
return;
}
mLastTime = currentTime;
mLastId = view.getId();
//执行原方法
joinPoint.proceed();
}
}
}
6.使用测试,在方法体上标注@SingleClick注解
@SingleClick
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.xxx:
Log.e(TAG, "onClick: 点击了点击了点击了");
break;
case R.id.et_search_user:
Log.e(TAG, "onClick: search");
break;
default:
Log.e(TAG, "onClick: ");
break;
}
}
代码copy轮子哥地址:https://github.com/getActivity/AndroidProject
Android开发平台的AOP框架:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx