Android 使用 APO Aspectj 简单处理按钮重复点击
APO Aspectj
效果:项目中所有View点击默认 固定时间内再次点击无效 ,有多次点击需求的View可以添加多次点击注释
Aspectj的Gradle插件
--------- 第一步 ---------
1:项目根目录下的build.gradle中,添加依赖:
dependencies {
…
classpath ‘com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0’ }
2:app或其他module目录下的build.gradle中,添加:
apply plugin: ‘android-aspectjx’ dependencies {
…
implementation ‘org.aspectj:aspectjrt:1.8.9’ }
我要的效果是整个项目的点击时间禁止短时间内连击,如果有需要连击的View 我们可以写一个注释达到效果
-------第二步----------(代码来了)
AspectTest控制类
********* 第一个类 AspectTest 整个类 ***********
注意 beforeEnableDoubleClick 方法上面的路径!! 路径 com.xxxxx
> /**
> * AspectTest class
> */
> @Aspect
> public class AspectTest {
> /**
> * 全局加注解可双击
> * canMoreClick 是否接受多次点击
> * mLastView 用于判断上次点击是不是同一个View
> */
> private boolean canMoreClick = false;
> private View mLastView;
>
> /**
> * 此方法在@MoreClcik 注解的时候会调用
> * canMoreClick = true; 设置为可重复点击的状态
> *!!!!----- 注意路径 annotation 是你注释类的地址 -----
> */
> @Before("@annotation(com.example.yangyongli.tool.aop.MoreClcik)")
> public void beforeEnableDoubleClick(JoinPoint joinPoint) throws Throwable {
> canMoreClick = true;
> }
>
> /**
> * 此方法是所有view的OnClicik
> * 内部判断是否是进行拦截 实现动作
> *
> * @param joinPoint
> * @throws Throwable
> */
> @Around("execution(* android.view.View.OnClickListener.onClick(..)) && target(Object) &&
> this(Object)")
> public void OnClickListener(ProceedingJoinPoint joinPoint) throws Throwable {
> Object[] objects = joinPoint.getArgs();
> View view = objects.length == 0 ? null : (View) objects[0];
> if (view != mLastView) {
> joinPoint.proceed();//执行
> MoreClcikUtils.lastClickTime = System.currentTimeMillis();
> } else {
>
> if (canMoreClick) {
> joinPoint.proceed();//执行
> canMoreClick = false;
> } else {
> if (!MoreClcikUtils.isNextClick()) {
> joinPoint.proceed();//在时间间隔外执行
> }
> }
>
> }
> mLastView = view;
> } }
********* 第二个类 MoreClcikUtils 一个判断时间的工具类 ***********
/**
* MoreClcikUtils Class
*/
public class MoreClcikUtils {
public static long lastClickTime = 0;
private static long INTERVAL_TIME = 1000;// 点击控制 间隔时长
/**
* 判断是否在间隔中
*/
public synchronized static boolean isNextClick() {
long currentTime = System.currentTimeMillis();
boolean isClick2;
if (currentTime - lastClickTime >
INTERVAL_TIME) {
isClick2 = false;
} else {
isClick2 = true;
}
lastClickTime = currentTime;
return isClick2;
}
}
*可多次点击的注解类
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
public @interface MoreClcik {
}
然后就可以使用了 不能用你就看看
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
使用 如下图