在ButterKnife中其中一个@OnClick注释中,其内部使用的是DebouncingOnClickListener这个方法。主要的作用是防止按钮被用户多次点击后产生多次OnClick事件。
关键代码:
static boolean enabled = true;
private static final Runnable ENABLE_AGAIN = () -> enabled = true;
@Override public final void onClick(View v) {
if (enabled) {
enabled = false;
v.post(ENABLE_AGAIN);
doClick(v);
}
}
public abstract void doClick(View v);
}
以上代码做的是利用一个变量enabled,在一次点击事件之后,下一次点击事件不会重复产生即防止点击事件多次发生。
其原理是当一个事件在View中发生的时候,会此事件放到View的消息队列(MessageQueue)中。当你第一次点击事件的时候,就把事件放到了消息队列中,这个时候再将""ENABLE_AGAIN()"改变静态控制变量的进程放入后面,点击事件发生后,第二个事件就是改变变量,这样保证了点击事件不会重复发生。
网友评论