Диалоговое окно Android Alert не отображается

Я искал в Stackoverflow, просматривал примеры в Android Developer и некоторые книги, и я просто не понял.

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

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

Вот код:

if(database populated)
{
  ....code.....

  if(parseok.contentEquals("Error"))
  {
    doForceClose();
  }
displayDate = "Last: " + parseok;  //I don't want the program to continue to here.
//Rest of code in the method.  If I continue the program will Force Close
}
else
  do something else

Вот метод AlertDialog:

private void doForceClose()
{
  String themessage = "Because some of the parameters have changed in the yada yada"; 

  AlertDialog.Builder ad = new AlertDialog.Builder (this);
  ad.setTitle("Internal Error");
  ad.setMessage(themessage);
  ad.setPositiveButton("Sorry", new OnClickListener()
  {
    public void onClick(DialogInterface dialog, int which)
    {
    finish();
    return;
    }
  });
  ad.create();
  ad.show();        
}

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

Очевидно, я чего-то не догоняю. Любые идеи?

edit: я нахожусь в классе, который расширяет активность


person eric    schedule 19.02.2011    source источник
comment
вы не против отформатировать код??   -  person Varun    schedule 19.02.2011
comment
попробуйте окружить код построителя alertdialog исполняемым файлом и поместить его в поток пользовательского интерфейса с помощью метода Activity.runOnUiThread().   -  person Nick Campion    schedule 19.02.2011
comment
Ник, это помогло. Спасибо! ВЫ очень помогли! Опубликуйте свой комментарий как ответ, и я нажму на него.   -  person eric    schedule 19.02.2011


Ответы (3)


Я пытаюсь показать окно AlertDialog, которое прерывает поток программы.

Этого нет в Android и других системах пользовательского интерфейса.

Мне нужно, чтобы моя программа перестала выполняться до тех пор, пока не будет нажата кнопка AlertDialog.

Нет, не знаешь. Программирование, управляемое событиями, используется уже пару десятилетий.

Логика программы: если синтаксический анализ плохой, программа принудительно закроется.

Это ваш код — перепишите его, чтобы он работал лучше.

Я не хочу, чтобы программа оставалась здесь.

Затем используйте else, или return, или что-то в этом роде.

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

Ваш диалог не появится, пока основной поток приложения снова не получит управление для обработки вашего запроса — show() является асинхронным. Вы падаете до этого, скорее всего.

Короче говоря, ваша стратегия решения проблемы синтаксического анализа в корне ошибочна.

person CommonsWare    schedule 19.02.2011

Ответ Commonsware правильный. Попробую сказать то же самое другими словами. Диалоговое окно предупреждения НЕ прерывает поток управления. Это просто «левое отображение», когда программа ожидает ввода.

таким образом, последовательность showAlert("это сообщение); showGallery(); return;

это показывает только на мгновение. Выход из этого состоит в том, чтобы поместить вызов функции showGallery() в Положительный ответ от AlertDialog.

Так сказать по-другому. Если вы хотите прервать поток вашего приложения с помощью AlertDialog (что мудро указано, это неправильно), то поместите код, который вы хотите выполнить после диалога, в обратный вызов onClick для AlertDialog.

person user462990    schedule 19.06.2012

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

Это выглядит странно, и я думаю, что диалогу нужно время, чтобы появиться, пока программа просто продолжает работать, а затем программа сталкивается с исключением, хронологически (но не программно) перед диалогом. Вот почему у меня появился диалог после того, как я исправил место исключения.

person MeskZ    schedule 25.01.2012