2012-06-05 2 views
0

Перед тем, как я высмеял, для блокирования основного потока пользовательского интерфейса, вот сценарий:Как показать progressdialog, когда основной поток пользовательского интерфейса заблокирован?

  1. Услуга, проходит один раз в день - занимает около 15 секунд, чтобы закончить. Операции Тяжелое базы данных
  2. По совпадению пользователь запускает приложение в течение этого времени
  3. Домашний экран загружает данные из базы данных
  4. Но поскольку база данных заблокирована (шаг 1), это выдает ошибку.

Поэтому мне нужно ЗАМОРАЖИВАТЬ поток пользовательского интерфейса, пока служба не будет завершена. Нет AsyncTask, потому что пользовательский интерфейс продолжит выполнение и выдаст ошибку. Мне удалось отключить функцию onResume до тех пор, пока сервис не завершится. Но за это время я не могу показать какие-либо диалоги, в которых пользователь должен ждать или любой индикатор прогресса, говорящий пользователю сидеть сложа руки.

Если я пытаюсь

start onResume 

if (service is running?) 
    show progress dialog 
    while the service is running, thread.sleep 
    dismiss progress dialog 

end onResume 

Нить спит хорошо и просыпается большой. Но проклятый диалог прогресса не отображается до тех пор, пока onResume ... не возобновится! В нижней строке, как мне показать индикатор (progressdialog или диалог), прежде чем я поставлю основной поток в режим сна?

Я открыт для решений, которые загружают другую деятельность до тех пор, пока услуга не возобновится. Я пробовал это, но предыдущее действие продолжается счастливо: |

ответ

3

Вы не можете отобразить диалог прогресса, если вы блокируете поток пользовательского интерфейса.

Я предполагаю, что вы хотите вызвать диалог в onResume, но пользовательский интерфейс не начнет показывать диалоговое окно перед тем, как onResume и onPaused будут выполнены. Но поскольку вы блокируете поток пользовательского интерфейса в OnResume, это не будет достигнуто до тех пор, пока блокировка не закончится. Поэтому его невозможно.

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

+0

Спасибо - я попробую ваш совет о создании «загрузочной активности» и дам вам знать, как это работает. Мне нужно найти способ убедиться, что активность вызывается первым, даже если пользователь переходит на главный экран и возвращается. Хм ... –

+0

Это, в конечном счете, было лучшим решением –

Смежные вопросы