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

问题描述 投票:0回答:1

自从我开始编码的第一天起,我就有一个常见的问题:避免多次处理事件(单击按钮。。。)。大多数时候,我想出一个简单的解决方案(添加一个布尔标志来检查),如下所示:

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;
}

这很好。但是随着班级的增加,具有更多的功能和事件,一切都开始出错。我们需要创建too many boolean flags,它对业务没有任何意义,并且不应是此类的字段

有人对此有更好的解决方案吗?

java android architecture software-design
1个回答
1
投票

该限制可以由包装器支持(如果您需要独立保护每个按钮的单击,则为该限制。)>

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开发人员,所以如果不同的线程可以调用'onClick',则使用AtomicBoolean。>

© www.soinside.com 2019 - 2024. All rights reserved.