【问题标题】:Good way to prevent duplicated event handle防止重复事件处理程序的好方法
【发布时间】:2020-04-24 21:56:17
【问题描述】:

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

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

这很好用。但是随着课程越来越大,功能和事件越来越多,一切都开始出错了。我们需要创建太多布尔标志,这对业务没有任何意义,并且不应该是此类的一个字段

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

【问题讨论】:

  • 布尔标志是状态,因此您可能希望使用状态机架构或基于视图模型的方法
  • 谢谢你回复我@Steyrix,你有什么例子吗?
  • 如果您可以使用状态机(在这种情况下,单击按钮会导致您更改整个视图的状态,具体取决于当前状态),您可能想要使用 redux 。不幸的是,我丢失了过去发现非常有用的文章。也许这个对你来说会很有趣jayrambhia.com/blog/android-redux-intro

标签: java android architecture software-design


【解决方案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 开发人员,所以使用 AtomicBoolean 以防 'onClick' 可以被不同的线程调用。

【讨论】:

  • 这是一个很好的解决方案,但有一个限制,不能为多个按钮使用 single 侦听器实例(让活动/片段扩展 View.OnClickListener 然后设置为 this )
  • 是的,我明白了,我建议为每个按钮使用单独的包装器
猜你喜欢
  • 2011-01-11
  • 2016-11-24
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多