防止Android点击按钮过快造成多次事件实现原理

自定义一个NoDoubleClickListener类,实现OnClickListener接口:

public abstract class NoDoubleClickListener implements View.OnClickListener {

    private static long lastClickTime = 0;

    public static final int MIN_CLICK_DELAY_TIME = 700;

    public abstract void onNoDoubleClick(View view);

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

使用NoDoubleClickListener代替OnClickListener来实现点击事件:

mbutton.setOnClickListener(new NoDoubleClickListener() {
        @Override
        protected void onNoDoubleClick(View v) {
            doSomeThing();
        }
    });
}

实现原理:

1. 在View的setOnClickListener中可以看到OnClickListener的对象赋值给了getListenerInfo().mOnClickListener

public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}

2. 在View类的performClick()中会调用mOnClickListener.onClick()方法

public boolean performClick() {
    final boolean result;
    final ListenerInfo li = mListenerInfo;
    if (li != null && li.mOnClickListener != null) {
        playSoundEffect(SoundEffectConstants.CLICK);
        li.mOnClickListener.onClick(this);
        result = true;
    } else {
        result = false;
    }

    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
    return result;
}

3. 调用View的onClick()后,就会回调NoDoubleClickListener中的onClick()方法,经过按键防抖处理后再回调onNoDoubleClick()方法

你可能感兴趣的:(Android)