【Android AOP--02】防止按钮连续点击

  • 时间:2020-04-24 20:56 作者:唠嗑008 来源: 阅读:554
  • 扫一扫,手机访问
摘要:假如连续屡次点击按钮会造成打开多个重复页面,或者者屡次请求,造成数据混乱。所以很多时候,我们需要避免这种情况发生。下面就通过AOP来实现这个功能。1、定义一个防止屡次点击的工具类/** * 防止按钮2连续屡次点击 * Created by zhouxu on 2018/9/17. */public c

假如连续屡次点击按钮会造成打开多个重复页面,或者者屡次请求,造成数据混乱。所以很多时候,我们需要避免这种情况发生。下面就通过AOP来实现这个功能。

1、定义一个防止屡次点击的工具类


/** * 防止按钮2连续屡次点击 * Created by zhouxu on 2018/9/17. */public class NoDoubleClickUtils {    private final static int SPACE_TIME = 500;//2次点击的间隔时间,单位ms    private static long lastClickTime;    public synchronized static boolean isDoubleClick() {        long currentTime = System.currentTimeMillis();        boolean isClick;        if (currentTime - lastClickTime > SPACE_TIME) {            isClick = false;        } else {            isClick = true;        }        lastClickTime = currentTime;        return isClick;    }}

2、使用AspectJ创立切面类,解决Poincuts等

@Aspectpublic class AspectTest {    final String TAG = AspectTest.class.getSimpleName();    @Around("execution(* android.view.View.OnClickListener.onClick(..))")    public void onClickLitener(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {        Log.e(TAG, "OnClick");        if (!NoDoubleClickUtils.isDoubleClick()) {           proceedingJoinPoint.proceed();       }    }}

@Aspect:表示这是一个切面类

@Around:环绕通知,会阻拦原方法内容的执行,也就是说会阻拦Activity中的onclick(),只执行AspectTest的onClickLitener()

proceedingJoinPoint.proceed();:表示这个方法执行完毕了,可以放开阻拦了,接下来就会执行Activity中的onclick()

"execution(* android.view.View.OnClickListener.onClick(..))":表示切点,也就是说所有的点击事件,都会执行这个方法。

3、Activity中无需增加任何代码

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Log.e(TAG, "button1 onClick: ");            }        });    }

连续点击的运行结果


可以看出在Activity的onclick处只执行了一次,也就是说通过AOP这种方式,在不侵入原有代码的情况下,就实现了防止连续点击的功能。

假如说要求部分按钮是可以连续点击的

这种情况,就需要自己设置Pointcuts了。

1、自己设置注解接口

/** * 自己设置Pointcuts * Created by zhouxu on 2018/9/17. */@Retention(RetentionPolicy.CLASS)@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})public @interface DoubleClick {}

2、解决切面的类AspectTest

@Aspectpublic class AspectTest {    final String TAG = AspectTest.class.getSimpleName();    private boolean isDoubleClick = false;    @Before("execution(@com.zx.aopdemo.DoubleClick  * *(..))")    public void beforeEnableDoubleClcik(JoinPoint joinPoint) throws Throwable {        Log.e(TAG, "beforeEnableDoubleClcik: ");        isDoubleClick = true;    }    @Around("execution(* android.view.View.OnClickListener.onClick(..))")    public void onClickLitener(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {        Log.e(TAG, "OnClick");//        if (!NoDoubleClickUtils.isDoubleClick()) {//            proceedingJoinPoint.proceed();//        }        if (isDoubleClick || !NoDoubleClickUtils.isDoubleClick()) {            proceedingJoinPoint.proceed();            isDoubleClick = false;        }    }}

3、在Activity中允许点击的onclick前加一个@DoubleClick的注解就好

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        testAOP();        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Log.e(TAG, "button1 onClick: ");            }        });        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {            @DoubleClick            @Override            public void onClick(View v) {                //允许连续点击                Log.e(TAG, "button2 onClick: ");            }        });    }}

连续点击button2的运行结果


可以发现button1是不能连续点击的,而加了@DoubleClick注解的button2是可以连续点击的

参考文章:AOP在Android中的应用-过滤重复点击

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】2FA验证器 验证码如何登录(2024-04-01 20:18)
【系统环境|】怎么做才能建设好外贸网站?(2023-12-20 10:05)
【系统环境|数据库】 潮玩宇宙游戏道具收集方法(2023-12-12 16:13)
【系统环境|】遥遥领先!青否数字人直播系统5.0发布,支持真人接管实时驱动!(2023-10-12 17:31)
【系统环境|服务器应用】克隆自己的数字人形象需要几步?(2023-09-20 17:13)
【系统环境|】Tiktok登录教程(2023-02-13 14:17)
【系统环境|】ZORRO佐罗软件安装教程及一键新机使用方法详细简介(2023-02-10 21:56)
【系统环境|】阿里云 centos 云盘扩容命令(2023-01-10 16:35)
【系统环境|】补单系统搭建补单源码搭建(2022-05-18 11:35)
【系统环境|服务器应用】高端显卡再度登上热搜,竟然是因为“断崖式”的降价(2022-04-12 19:47)
手机二维码手机访问领取大礼包
返回顶部