Обходите модальные диалоговые окна Android, нажимая кнопки в два раза быстрее? - PullRequest
1 голос
/ 14 апреля 2011

Допустим, у нас есть две кнопки, каждая с OnClickListener. Каждый из слушателей показывает ProgressDialog и выполняет некоторую фоновую работу. (За сценой AsyncTask, диалог открывается в onPreExecute. Я не думаю, что это имеет значение, только для записи ...). Допустим, есть какое-то правило, гласящее, что в любой момент времени может быть активным не более одного фонового работника.

Я предполагал, что диалог предотвращает одновременную работу двух фоновых рабочих. Я думал, что модальное диалоговое окно блокирует пользовательский интерфейс, и невозможно нажать другую кнопку после вызова метода show (). Я был не прав.

Если вы нажмете кнопки достаточно быстро, вы сможете запустить обоих фоновых рабочих (почти) одновременно. Журнал показывает, что можно нажать две кнопки в течение 150 мс, несмотря на диалог:

04-14 18:34:04.390: DEBUG/greenrobot(1860): Clicked: 2131034112
04-14 18:34:04.470: DEBUG/greenrobot(1860): doInBackground2: 2131034112
04-14 18:34:04.540: DEBUG/greenrobot(1860): Clicked: 2131034113
04-14 18:34:04.570: DEBUG/greenrobot(1860): doInBackground2: 2131034113

Код диалога выглядит следующим образом:

progressDialog = new ProgressDialog(currentActivity);
progressDialog.setMessage(msg);
progressDialog.show(); 

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

1 Ответ

1 голос
/ 15 апреля 2011

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

show() является асинхронным. Диалог не появится сразу после вызова show(). Это произойдет через несколько минут.

...