Хороший способ предотвратить дублирование дескриптора события - PullRequest
0 голосов
/ 07 января 2020

У меня общая проблема с первого дня, когда я начинаю кодировать: избегайте обработки события (нажатия кнопки, ..) несколько раз. Большую часть времени я придумываю простое решение (которое добавляет проверяемый логический флаг), например:

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

Это работало нормально. Но когда класс go стал больше с большим количеством функций и событий, все пошло не так. Нам нужно создать слишком много логических флагов , которые ничего не значат для бизнеса, и не должно быть полем этого класса .

У кого-нибудь есть лучшее решение для этого?

1 Ответ

1 голос
/ 07 января 2020

Ограничение может поддерживаться с помощью оболочки (если вам нужно защитить нажатие каждой кнопки независимо).

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' может вызываться разными потоками.

...