Android блокировки EventListener и даже обработка - PullRequest
2 голосов
/ 07 августа 2011

У меня есть простая кнопка onClickListener в моем приложении для Android, и все, что она делает, это записывает некоторые вещи в базу данных. Это выглядит примерно так

private void setEventListeners(){
    mSpecialViewClass.getSubmitButton().setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            handleSubmitClick();
        }
    });
}

private void handleSubmitClicks(){
    if (counter<0){
        writeCounterToDb();
    } else {
        //do some stuff
        closeDatabase();
    }
}

теперь это работает хорошо, но если я нажму на кнопку достаточно быстро, я получу ошибку закрытой БД

java.lang.IllegalStateException: database not open

Как я могу запретить ключевому слушателю что-либо делать до того, как было обработано предыдущее ключевое событие?

Редактировать: какой-то пользователь предложил закрыть мою базу данных на Activity.onDestroy (), что довольно неплохо, и он удалил ответ. Это хороший обходной путь для моей проблемы, но все еще не решение, которое я ищу.

Я также попытался отключить кнопку и включить кнопку в различных положениях, и проблема остается. Кажется, я всегда могу добиться того, что функция вызывается слишком много раз, если я нажимаю на кнопку слишком быстро.

1 Ответ

1 голос
/ 07 августа 2011

Хороший трюк с пользовательским интерфейсом, который вы могли бы здесь использовать, состоит в том, чтобы отключить кнопку, когда пользователь нажимает.Просто сделайте что-то вроде этого:

@Override
public void onClick(View arg0) {
    arg0.setEnabled(false);
    handleSubmitClick();
}

Вы, конечно, можете включить кнопку в конце функции onClick, если вам нужно.

Пока кнопка отключена, пользователь не сможет нажать на нее, поэтому вы никогда не получите два события onClick.Более того, стиль кнопки меняется, поэтому пользователь будет знать, что нажатие ничего не изменит.

Этот метод используется повсеместно (например, кнопка отправки Gmail), и я считаю его хорошимДизайн пользовательского интерфейса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...