Как отобразить ProgressDialog при подготовке к показу другого действия?

Мне нужно показать активность с MapView, если пользователь долго нажимал на элемент списка. Этот процесс занимает некоторое время, поэтому я хотел бы показать пользователю прогресс, пока приложение зависает. Вот код:

ListView listView = (ListView) findViewById(android.R.id.list);
listView.setOnItemLongClickListener (new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
...
  ProgressDialog dialog = ProgressDialog.show(getApplicationContext(), "", "Loading. Please wait...", true);
  Intent intent = new Intent(getBaseContext(), Map.class);
  startActivity(intent);

Я выбрал правильный подход? Получение различных FC сейчас (в зависимости от контекста, выбранного для ProgressDialog). Может ли ProgressBar отображаться в моем сценарии?

Обновлено. Я пытался показать Toast перед началом активности. Опять же, Toast отображается только тогда, когда карта уже отображается. Не понимаю, что происходит. Если я удаляю код startActivity, то сразу отображается Toast.


person LA_    schedule 03.07.2011    source источник


Ответы (1)


Вы сами выполняете длительную подготовку в onCreate() MapView? Вы не должны, потому что это заблокирует поток пользовательского интерфейса....

Вместо этого, что вы должны сделать - внутри действия карты onCreate() вы должны создать новую AsyncTask (в идеале) и показать там индикатор выполнения (и выйти из onCreate() сразу после отображения индикатора выполнения). Затем в AsyncTask после его завершения (в postExecuted()) вы должны закрыть диалоговое окно прогресса и показать свою карту. PostExecuted() запускается в потоке пользовательского интерфейса, поэтому вы можете безопасно закрыть индикатор выполнения.

FC, которые у вас есть, и, возможно, ANR (не отвечает), вероятно, появятся, потому что вы делаете определенные вещи в потоке пользовательского интерфейса или вне его. Вы ДОЛЖНЫ создавать/закрывать свои компоненты пользовательского интерфейса в потоке пользовательского интерфейса, и вам НЕ СЛЕДУЕТ выполнять длительную операцию в потоке пользовательского интерфейса. Это эмпирическое правило.

person Jarek Potiuk    schedule 03.07.2011
comment
Спасибо за ответ. Собственно, если я ничего не делаю в onCreate(), а просто показываю карту - все равно какое-то время зависает. Похоже, загрузка самой активности карты занимает много времени. Должен ли я попытаться запустить это действие в ASyncTask? - person LA_; 03.07.2011
comment
Хорошо, использование ASyncTask помогло. - person LA_; 08.07.2011