Android防止过快点击造成多次事件 一行代码搞定,特别简单,可以复用

onClick事件是Android开发中最常见的事件,正常情况下这段代码是没什么问题的,

但是Android设备的机型性能等千差万别,如果碰到比较卡的手机,

则有可能出现submitOrder()函数跳转页面出现延迟的现象。碰到这种现象,则用户就很有可能再次点击一次,

从而造成函数被调用两次,出现重复订单的BUG。

解决方法

方案一:(不建议)

一般地,碰到这现象,首先就会想到的就是在点击之后把submitButton设置为不可点击:

此方法也确实有效,不过如果submitOrder()方法没有成功,需要再次提交订单时又需要再重复把submitButton设置为可点击状态。

如果类似的button比较多时,就显得比较麻烦、混乱。

方案二

自定义一个NoDoubleClickListener,继承自OnClickListener:

public abstract class NoDoubleClickListener implements OnClickListener {

		public static final int MIN_CLICK_DELAY_TIME = 1000;//这里设置不能超过多长时间
		private long lastClickTime = 0;

		protected abstract void onNoDoubleClick(View v);
		@Override
		public void onClick(View v) {
			long currentTime = Calendar.getInstance().getTimeInMillis();
			if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
				lastClickTime = currentTime;
				onNoDoubleClick(v);
			}
		}
	}

给submitButton设置点击事件时用NoDoubleClickListener代替OnClickListener,并且实现方法onNoDoubleClick代替onClick即可,像这样:

		submitButton.setOnClickListener(new NoDoubleClickListener() {
            @Override
            public void onNoDoubleClick(View v) {
                submitOrder();
            }
        });

原理:

很简单,见代码……

就是用onNoDoubleClick代替onClick处理具体的操作,在onClick方法中加一个判断:在接收到点击事件之后,

先判断一下时间,如果距离上次处理操作不足MIN_CLICK_DELAY_TIME,就忽视——即能防止误操作的连续点击导致重复事件。

MIN_CLICK_DELAY_TIME可调。

优势

好处是不用改变原有代码的逻辑,就只需要两个替换:NoDoubleClickListener代替OnClickListener,

onNoDoubleClick代替onClick。 代码的结构等都不需要做改变(**对比上面的代码0跟代码**3),

不需要关心处理更改button的状态这些额外判断逻辑,只需要关注业务逻辑即可,简洁优雅~

时间: 2024-10-29 04:07:41

Android防止过快点击造成多次事件 一行代码搞定,特别简单,可以复用的相关文章

Android防止过快点击造成多次事件

问题 onClick事件是Android开发中最常见的事件.比如,一个submitButton,功能是点击之后会提交一个订单, 则一般代码如下,其中submitOrder()函数会跳转到下一页进行处理 : //代码0 submitButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { submitOrder(); } }); 正常情况下这段代码是没什么问题的,但是Andro

Android:防止过快点击造成多次事件

Android:防止过快点击造成多次事件 问题 onClick事件是Android开发中最常见的事件.比如,一个submitButton,功能是点击之后会提交一个订单, 则一般代码如下,其中submitOrder()函数会跳转到下一页进行处理 : //代码0 submitButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { submitOrder(); } }); 正常情

猫猫学IOS(四十一)UI之核心动画 两行代码搞定3D转场(做android的哭死)

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 源码素材地址:http://blog.csdn.net/u013357243/article/details/45583465 效果: 代码: 其实代码很少,苹果都给封装好了 // 1.创建核心动画 CATransition *ca = [CATransition animation]; // 1.1动画过渡类型 ca.typ

Android开发:一句代码搞定eclipse查看v4源码

在android开发的时候,看不到源码其实是很悲催的事情的,关于如何查看源码的博文已经许多了,可是今天在试图添加V4源码的时候,发现了许多麻烦且不靠谱的方式,实验了许久,还是没有加上,比如以下的这些方法: 解决eclipse无法打开android-support-v4的源码 解决eclipse无法查看v4,v7-appcompat源码 Android 如何在Eclipse中查看Android API源码以及support包源码 跟着这些复杂方法,弄了很久,最终也没有搞定,后来柳暗花明,终于在st

Android:防止过快点击造成多次事件 问题

自定义一个NoDoubleClickListener,继承自OnClickListener: public abstract class NoDoubleClickListener implements View.OnClickListener { public static final int MIN_CLICK_DELAY_TIME = 1000; private long lastClickTime = 0; @Override public void onClick(View v) {

android自定义dialog中点击listview的item事件关闭dialog

import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.os.Bundle; import android.view.Display; import android.view.Gravity; import android.view.View;

Android IOC 之 注解绑定控件 以及事件 事例 代码简单注释讲解

想必开发过android的都使用过一些 框架,然而框架里都会使用一些,注解来帮助我们,节省大量的代码开发量.同时也使代码更加的简洁. 但是注解是通过java反射来实现的当然可能会牺牲掉一些性能. 以下是本人写的一个较为简单的绑定控件,并且触发其OnclickListem 事件. //直接先看下注解方法.比较简单,清晰 public class MainActivity extends FragmentActivity { <span style="white-space:pre"

关于Android sdk有事安装出现报Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml错误的问题 只要两部就可以搞定

第一步 Windows 系统hosts位于 C:\Windows\System32\drivers\etc\hosts Android(安卓)系统hosts位于 /system/etc/hosts Mac(苹果电脑)系统hosts跟Linux一样位于 /etc/hosts iPhone(iOS)系统hosts跟Linux Mac一样位于 /etc/hosts Linux系统hosts位于 /etc/hosts 第二步 链接:http://pan.baidu.com/s/1c2uZ3sk 密码:m

WPF一段代码搞定所有的点击事件

用一个方法来控制转发所有的点击事件,界面图如下:    <Page x:Class="WPFNavigate.Index" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Home"> <Page.Res