java - 防止重复事件句柄的好方法

标签 java android architecture software-design

自从我开始编码的第一天起,我就遇到了一个常见问题:避免多次处理一个事件(按钮单击,..)。大多数时候,我会想出一个简单的解决方案(添加一个 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/

相关文章:

java - 如何获取 JTextPane 的内容?

java - Java的Matcher.replaceAll如何获取内部匹配结果?

java - 如何解决 Android 应用程序的服务器响应问题

android studio 在 ubuntu 上使用了很多 ram

architecture - 如何导致用户进程的 TLB 抖动?

java - 选择一个缓存实现,还是自己动手?

java.sql.SQLException : Illegal hour value '50' for java. sql.Time 类型的值 '50:51:05

android - 如何在android中使用纬度和经度获取城市名称

关于在 C 中处理具有相同签名的多个函数的代码质量问题

.net - 在客户端或业务层构建对象?