Android:早すぎるクリックによる複数回のイベントの発生を防止


Android:早すぎるクリックによる複数回のイベントの発生を防止
に質問
onClickイベントはAndroid開発で最も一般的なイベントです.たとえば、submitButtonは、クリックした後に注文書を発行する機能を持っています.一般的なコードは次のとおりです.submitOrder()関数は次のページにジャンプして処理されます.
        //  0
        submitButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                submitOrder();
            }
        }); 

通常、このコードは問題ありませんが、Androidデバイスの機種性能などは千差万別で、比較カードの携帯電話に遭遇するとsubmitOrder()関数のジャンプページが遅延する可能性があります.このような現象に遭遇すると,ユーザがもう一度クリックする可能性が高く,関数が2回呼び出され,注文を繰り返すBUGが現れる.一般的に、この現象に遭遇すると、まず考えられるのは、クリックした後にsubmitButtonをクリック不可に設定することです.
        //  1
        submitButton.setClickable(false);
        //   
        submitButton.setEnabled(false); 

この方法も確かに有効ですが、submitOrder()メソッドが成功しなかった場合、注文を再提出する必要がある場合は、submitButtonをクリック可能な状態に設定する必要があります.似たようなbuttonが多いと、面倒で混乱します.
イニシアチブ
——————-so、次は私たちが に見える方法ですね、~(@^^@)~—————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にクリックイベントを設定する場合、OnClickListenerの代わりにNoDoubleClickListenerを使用し、onClickの代わりにonNoDoubleClickを実装すればよい.
        //  3
        submitButton.setOnClickListener(new NoDoubleClickListener() {
            @Override
            public void onNoDoubleClick(View v) {
                submitOrder();
            }
        }); 

原理:
簡単です.コードを参照してください.onClickの代わりにonNoDoubleClickを使用して具体的な操作を処理します.onClickメソッドには、クリックイベントを受信した後、まず時間を判断し、前回の処理操作からMIN_未満であればCLICK_DELAY_TIMEは,誤操作を防止できる連続クリックによる重複イベントを無視する.
MIN_CLICK_DELAY_TIME可変.
メリット
メリットは、既存のコードの論理を変更することなく、NoDoubleClickListenerがOnClickListenerの代わりに、onNoDoubleClickがonClickの代わりに、2つの置き換えが必要になることです.コードの构造などを変更する必要はありません(***上のコード0とコード**3を比较します)、buttonの状态を変更することを処理することに関心を持つ必要はありませんこれらの余分な判断ロジックは、ビジネスロジックに関心を持つだけで、简洁で优雅です~
この文書は、私の独立したブログに同期して公開されます.http://www.barryzhang.com/archives/410