zoukankan      html  css  js  c++  java
  • Android防止过快点击造成多次事件

    问题

    onClick事件是Android开发中最常见的事件。

    比方,一个submitButton。功能是点击之后会提交一个订单,
    则一般代码例如以下,当中submitOrder()函数会跳转到下一页进行处理 :

        //代码0
            submitButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    submitOrder();
                }
            }); 

    正常情况下这段代码是没什么问题的,可是Android设备的机型性能等千差万别,假设碰到比較卡的手机。则有可能出现submitOrder()函数跳转页面出现延迟的现象。碰到这样的现象,则用户就非常有可能再次点击一次,从而造成函数被调用两次。出现反复订单的BUG。
    一般地,碰到这现象,首先就会想到的就是在点击之后把submitButton设置为不可点击:
         //代码1
            submitButton.setClickable(false);
            //或者   
            submitButton.setEnabled(false); </code>

    此方法也确实有效,只是假设submitOrder()方法没有成功,须要再次提交订单时又须要再反复把submitButton设置为可点击状态。假设类似的button比較多时,就显得比較麻烦、混乱。

    方案 

    自己定义一个NoDoubleClickListener,继承自OnClickListener
        //代码2
            public abstract class NoDoubleClickListener implements OnClickListener {
     
                public static final int MIN_CLICK_DELAY_TIME = 1000;
                private long lastClickTime = 0;
     
                @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就可以,像这样:

    <span style="font-size:14px;">      //代码3
            submitButton.setOnClickListener(new NoDoubleClickListener() {
                @Override
                public void onNoDoubleClick(View v) {
                    submitOrder();
                }
            }); </span>


    原理

    非常easy,见代码……
    就是用onNoDoubleClick取代onClick处理详细的操作,在onClick方法中加一个推断:在接收到点击事件之后,先推断一下时间,假设距离上次处理操作不足MIN_CLICK_DELAY_TIME,就忽视——即能防止误操作的连续点击导致反复事件。

    MIN_CLICK_DELAY_TIME可调。

    优势

    优点是不用改变原有代码的逻辑,就仅仅须要两个替换:NoDoubleClickListener取代OnClickListener,onNoDoubleClick取代onClick。 代码的结构等都不须要做改变(**对照上面的代码0跟代码**3),不须要关心处理更改button的状态这些额外推断逻辑,仅仅须要关注业务逻辑就可以,简洁优雅~

  • 相关阅读:
    新的工作电脑 神州优雅A550i7
    职责链模式(Chain of Responsibility)
    访问者模式(Visitor)
    单例模式(Singleton)
    解释器模式(Interpreter)
    迭代器模式(Iterator)
    解决 Visual Stuido 工具栏中的工具重置后,恢复回来。
    WCF 一步一步 发布 WCF服务 到 Windows 服务 (图)
    桥接模式(Bridge)与合成/聚合复用原则(CARP)
    dbentry访问带密码的Access
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7261975.html
Copyright © 2011-2022 走看看