Допустим, у нас есть две кнопки, каждая с 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();
Что я пропустил? Я надеюсь, что пропустил что-то действительно глупое, потому что в противном случае я не могу придумать хорошее решение, предотвращающее взаимодействие пользовательского интерфейса после щелчка. Синхронизация фоновых рабочих не является решением, потому что пользовательский интерфейс и сценарий более сложны.