[Android]イベントの連続実行を阻止する

ボタンの連続押しとか

Androidアプリを開発する中で、例えばボタンを押下すると次のアクティビティへ遷移する場合、ボタンへのonClickListenerを設定してやります。

こんな感じですよね

Button bt = (Button)view.findViewById(R.id.Button1);
bt.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// クリック時のイベント
			}
		});

でもこれをこのまま実装すると、ボタンの連続押しができてしまいます

そんなことをされると、、、大変嫌です

回避策を考える

回避策としては、前回イベントが発火した時間を覚えておいて、今回イベント発火時の時刻と比較して、一定時間以上たっていたらOKみたいなやり方がシンプルかなと

で、調べてみるとやはり先人が同じようなことを実装してはりました
Androidでボタン連打制御

参考にしながらちょこっと変えて実装してみます

例えばこんな感じの関数を用意します

private static final int DELAY = 1000;  // 1秒未満のイベントは無視
private static long mOldTime;           // 前回イベント実施時刻
    
public boolean isClickEvent(){ return isClickEvent(CLICK_DELAY); }
public boolean isClickEvent(long delay) {
    // 今の時間を覚える
    long time = System.currentTimeMillis();
 
    // 前回の時間と比較してdelay秒以上経っていないと無視
    if (time - mOldTime < delay) {
    	Logger.e("イベント連続実行!!");
        return false;
    }
 
    // 一定時間経過したら実行可能とする
    mOldTime = time;
    return true;
}

で、イベント実行時にこの関数で実行可能かをチェックします

Button bt = (Button)view.findViewById(R.id.Button1);
bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // クリック時のイベント
                if(!isClickEvent()) return;
            }
        });

こんな感じで嫌な思いをしなくて済みます

違うやり方

上みたいなやり方でもいいのですが、それじゃあ1秒以上かかる処理をしている最中にもう一度ボタンを押されるとダメですね
(いや、でもそんな長い処理はちゃんと処理中画面出したりするでしょうけど、、、)

ほんとにちゃんとやるなら、クリックイベント時にフラグを立ててしまって、イベント終了時にフラグを戻すっていう処理をするのが一番かと思います

でも、このやり方はフラグの制御をちゃんとしないと一生ボタン押せなくなったりもするので慎重に、、、

私はそこらへんが面倒臭いので、時間でチェックすることにします