自从我开始编码的第一天起,我就遇到了一个常见问题:避免多次处理一个事件(按钮单击,..)。大多数时候,我会想出一个简单的解决方案(添加一个 boolean 标志来检查),如下所示:
private boolean isProcessingClick = false;
@Override
public void onClick(View v) {
onLoginButtonClick();
}
private void onLoginButtonClick() {
if (isProcessingClick)
return;
isProcessingClick = true;
// Do something..
// Update some UIs..
isProcessingClick = false;
}
这工作得很好。但随着类(class)规模越来越大,功能和 Activity 越来越多,一切都开始出错了。我们需要创建太多 boolean 标志,这对业务没有任何意义,并且不应该是此类的字段。
有没有人有更好的解决方案?
最佳答案
可以通过包装器支持该限制(如果您需要独立保护每个按钮的点击)。
class MyOnClickListener implements View.OnClickListener {
private final View.OnClickListener internal;
private final AtomicBoolean isProcessingClick = new AtomicBoolean();
public MyOnClickListener(View.OnClickListener internal) {
this.internal = internal;
}
@Override
public void onClick(View v) {
try {
boolean noProcessing = this.isProcessingClick.compareAndSet(false, true);
if(noProcessing) {
internal.onClick(v);
} else {
// it's good to show some alert for the user here
}
} finally {
isProcessingClick.set(false);
}
}
}
我不是 Android 开发人员,因此使用 AtomicBoolean
以防“onClick”可以由不同线程调用。
关于java - 防止重复事件句柄的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59627641/