2015-09-10 4 views
3

У меня есть этот метод, который в основном ждет, когда элементы в очереди одиночной очереди станут пустыми, будет запущена служба фона, и служба остановится после удаления всех элементов в очереди и обрабатывать каждый по одному. Этот код запускается в основном потоке, что произойдет, когда я позвоню, подождите здесь? будет ли отображаться диалоговое окно предупреждения и блокирование пользователя от выполнения каких-либо других действий?Можно ли заблокировать поток пользовательского интерфейса при показе диалогового окна Alert

void waitForService() { 
    openConnectionToUploadQueue(); 
    if(answersQueue.getCount(objInterviewQuestion.getQid()) <= 0){ 
     answersQueue.close(); 
     return; 
    } 
    if(!answersQueue.isInterviewUploadServiceRunning()) { 
     answersQueue.startInterviewUploadService(); 
    } 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle(getString(R.string.auto_submit_alert_title)); 
    builder.setCancelable(false); 
    builder.setMessage(R.string.uploading_pending_answers); 
    AlertDialog waitForServiceDialog = builder.create(); 
    waitForServiceDialog.show(); 
    while (answersQueue.getCount(objInterviewQuestion.getQid()) > 0) { 
     // do nothing and keep loop running till answersQueue is empty 
    } 
    waitForServiceDialog.dismiss(); 
} 
+2

Это плохая идея, никогда не блокировать поток пользовательского интерфейса, вместо того, чтобы иметь обратный вызов вы распускать диалог с. Ваша текущая реализация может генерировать anr аварий. – JohanShogun

+0

только что понятый вызов wait() здесь глупо отредактировал вопрос, чтобы я не казался глупым для будущих посетителей>.> – Bhargav

ответ

7

Вы никогда не должны блокировать поток пользовательского интерфейса. Когда вы удерживаете UI Thread слишком долго, это когда система покажет диалог XXX is not responding и попросит пользователя убить ваше приложение.

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

Edit:

Как уже говорилось, вам нужно будет реализовать BroadcastReceiver

Вот демонстрационный проект шахты для чего-то еще, вы можете использовать его в качестве образца, как создавать и использовать BroadcastReceiver ,

https://github.com/cyfung/ActivityRecognitionSample

+0

как это сделать, моя служба построена таким образом, что из моей активности я нажимаю объекты на очередь и забудьте о них, мой сервис позаботится о их загрузке, и никаких обратных вызовов из службы не будет. Даже если бы я должен был создать интерфейс обратного вызова, как мне передать реализацию этого интерфейса в службу? – Bhargav

+0

вы просто говорите, что у вас есть служба, которая отвечает за загрузку. В вашем сервисе вы должны отправить «Broadcast», где «Активность» должна зарегистрировать «BroadcastReceiver», когда передача, полученная для завершения службы, завершена, вы отклоните диалог –

+0

, к сожалению, это меня не устраивает, потому что услуга будет вызываться одновременно и выключена раз, и большую часть времени я не хочу показывать какие-либо диалоги – Bhargav

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

  • Нет связанных вопросов^_^