Многократное срабатывание события клика

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

public abstract class ClickListener implements View.OnClickListener{

	private long lastCallTime;

	@Override
	public void onClick(View v) {

		if (System.currentTimeMillis() - lastCallTime >= 300) {
			clickHandler(v);
		}

		lastCallTime = System.currentTimeMillis();
	}

	public abstract void clickHandler(View v);

}


Есть ли глобальное решение проблемы не требущее использования своего обработчика?
И в чем причина такого поведения?
  • Вопрос задан
  • 3062 просмотра
Пригласить эксперта
Ответы на вопрос 1
@asmforce
Что-то у меня не получилось воспроизвести описанную ошибку — обработчик выполняется лишь единожды, как и должен:
pastebin.com/EVLUsBhx

Вообще, весь пользовательский интерфейс обрабатывается исключительно в главном UI-потоке, т.е. интерфейс «не отвечает» пока выполняется любой listener. Может быть, ваша проблема где-то в другом месте? Попробуйте сделать «чистый» эксперимент.

Я тестировал только на Android 2.3.6 (на реальном девайсе). Может, в более поздних версиях появилась эта ошибка?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы